J 2 SEでJPAを使用してEntityManagerで発生した問題記録にアクセスする
public class Main {
public static void main(String[] args) {
EntityManagerFactory factory = Persistence.createEntityManagerFactory("HelloTitan");
EntityManager em = factory.createEntityManager();
Cabin c = new Cabin();
c.setId(0);
c.setBedCount(50);
c.setDeckLevel(2);
c.setName("CabinOne");
c.setShipId(0);
em.persist(c);
System.out.println( em.contains(c) );
Cabin b = em.find(Cabin.class, 0);
System.out.println(b.getName());
em.close();
factory.close();
}
}
問題1:
Exception in thread "main"javax.persistence.PersistenceException: No Persistence provider for EntityManager named HelloTitan at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:56) at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:34) at Main.main(Main.java:10)
理由:Persistence providerがない
解決策:classpathに必要なlibを追加し、Jbossはhibernate実装を使用しています.これらのlibは次のディレクトリで見つけることができます.
jboss-5.0.0.GA\common\lib\
hibernate-annotations.jar
hibernate-commons-annotations.jar
hibernate-core.jar
hibernate-entitymanager.jar
hibernate-jmx.jar
hibernate-validation.jar
commons-collections.jarにも依存
問題2:
Exception in thread "main" javax.persistence.PersistenceException: [PersistenceUnit: HelloTitan] Unable to build EntityManagerFactory
at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:677)
at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:126)
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:52)
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:34)
at Main.main(Main.java:10)
Caused by: org.hibernate.HibernateException: Could not find datasource
at org.hibernate.connection.DatasourceConnectionProvider.configure(DatasourceConnectionProvider.java:79)
at org.hibernate.connection.ConnectionProviderFactory.newConnectionProvider(ConnectionProviderFactory.java:137)
at org.hibernate.ejb.InjectionSettingsFactory.createConnectionProvider(InjectionSettingsFactory.java:29)
at org.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:89)
at org.hibernate.cfg.Configuration.buildSettings(Configuration.java:2101)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1325)
at org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:867)
at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:669)
... 4 more
Caused by: javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file: java.naming.factory.initial
at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:645)
at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:288)
at javax.naming.InitialContext.getURLOrDefaultInitCtx(InitialContext.java:325)
at javax.naming.InitialContext.lookup(InitialContext.java:392)
at org.hibernate.connection.DatasourceConnectionProvider.configure(DatasourceConnectionProvider.java:75)
... 11 more
原因:JNDIは初期化に成功しなかった
解決策: classpathにjnid.propertiesファイルを追加します(JBossの場合、以下のように構成されています).
java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces
java.naming.provider.url=localhost:1099
問題3:
プログラムは正常に実行されましたが、データはデータベースに書き込まれませんでした.
理由:データがコミットされていません
解決策:em.getTransaction().commit();
その他の関連レコード:
J 2 SE環境でJPAを使用した(Hibernate+MySQL)persistence.xml例
JNDIのデータソースを使用する場合は、non-jta-data-sourceのコメントを削除し、JNDIのMySqlDSにアクセスできることに注意してください.
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0"
xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
<persistence-unit name="EntityRelationships"
transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<!--
<non-jta-data-source>MySqlDS</non-jta-data-source>
-->
<class>cn.heapstack.jpa.entityrelationships.domain.Customer</class>
<class>cn.heapstack.jpa.entityrelationships.domain.Address</class>
<class>cn.heapstack.jpa.entityrelationships.domain.CreditCard</class>
<class>cn.heapstack.jpa.entityrelationships.domain.Phone</class>
<class>cn.heapstack.jpa.entityrelationships.domain.Ship</class>
<class>cn.heapstack.jpa.entityrelationships.domain.Cruise</class>
<properties>
<property name="hibernate.hbm2ddl.auto" value="update" />
<property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver" />
<property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/ejb3" />
<property name="hibernate.connection.username" value="root" />
<property name="hibernate.connection.password" value="root000" />
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
<property name="hibernate.show_sql" value="true" />
<!--
<property name="hibernate.format_sql" value="true" />
-->
</properties>
</persistence-unit>
</persistence>
JBossでMySqlDSデータソースを構成するにはどうすればいいですか?
このファイルを見つけて、jboss-5.0.0.GAdocsexamplesjcamysql-ds.xmlを変更します.
修正が完了したらjboss-5.0.0.GAserverdefaultdeployディレクトリの下に置き、JBossを再起動すればよい
同時に私のもう一つの文章を参照してください:JNDIを使用してJBOSS内で構成されたデータソースで発生した問題を検索します...
-----------------------------------------------------