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内で構成されたデータソースで発生した問題を検索します...
 
 
-----------------------------------------------------