EntityManager
永続化ユニットを定義せずに初期化する方法はありますか? エンティティ マネージャーを作成するために必要なすべてのプロパティを指定できますか? EntityManager
実行時にユーザーが指定した値からを作成する必要があります。を更新しpersistence.xml
て再コンパイルすることはできません。
これを行う方法についてのアイデアは大歓迎です!
EntityManager
永続化ユニットを定義せずに初期化する方法はありますか? エンティティ マネージャーを作成するために必要なすべてのプロパティを指定できますか? EntityManager
実行時にユーザーが指定した値からを作成する必要があります。を更新しpersistence.xml
て再コンパイルすることはできません。
これを行う方法についてのアイデアは大歓迎です!
EntityManager
永続化ユニットを定義せずに初期化する方法はありますか?
デプロイメント記述子で少なくとも1 つの持続性ユニットを定義する必要があります。persistence.xml
を作成するために必要なすべてのプロパティを指定できます
Entitymanager
か?
persistence.xml
ファイルである必要があります。<persistence>
<persistence-unit name="[REQUIRED_PERSISTENCE_UNIT_NAME_GOES_HERE]">
SOME_PROPERTIES
</persistence-unit>
</persistence>
Java EE 環境では、 要素
jta-data-source
と要素を使用して、永続化プロバイダが使用するJTA および/または非 JTA データ ソースのグローバル JNDI 名non-jta-data-source
を指定します。
したがって、ターゲット アプリケーション サーバーが JTA (JBoss、Websphere、GlassFish) をサポートしている場合、persistence.xml
次のようになります。
<persistence>
<persistence-unit name="[REQUIRED_PERSISTENCE_UNIT_NAME_GOES_HERE]">
<!--GLOBAL_JNDI_GOES_HERE-->
<jta-data-source>jdbc/myDS</jta-data-source>
</persistence-unit>
</persistence>
ターゲット アプリケーション サーバーが JTA (Tomcat) をサポートしていない場合、persistence.xml
次のようになります。
<persistence>
<persistence-unit name="[REQUIRED_PERSISTENCE_UNIT_NAME_GOES_HERE]">
<!--GLOBAL_JNDI_GOES_HERE-->
<non-jta-data-source>jdbc/myDS</non-jta-data-source>
</persistence-unit>
</persistence>
データ ソースがグローバル JNDI にバインドされていない場合 (Java EE コンテナーの外部など)、通常は JPA プロバイダー、ドライバー、url、ユーザー、およびパスワードのプロパティを定義します。ただし、プロパティ名は JPA プロバイダーに依存します。したがって、JPA プロバイダーとしての Hibernate の場合、persistence.xml
ファイルは次のようになります。
<persistence>
<persistence-unit name="[REQUIRED_PERSISTENCE_UNIT_NAME_GOES_HERE]">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<class>br.com.persistence.SomeClass</class>
<properties>
<property name="hibernate.connection.driver_class" value="org.apache.derby.jdbc.ClientDriver"/>
<property name="hibernate.connection.url" value="jdbc:derby://localhost:1527/EmpServDB;create=true"/>
<property name="hibernate.connection.username" value="APP"/>
<property name="hibernate.connection.password" value="APP"/>
</properties>
</persistence-unit>
</persistence>
取引タイプ属性
一般に、Java EE 環境では、トランザクション タイプは
RESOURCE_LOCAL
非 JTA データソースが提供されることを前提としています。Java EE 環境では、この要素が指定されていない場合、デフォルトは JTA です。Java SE 環境では、この要素が指定されていない場合、デフォルトのRESOURCE_LOCAL
が想定される場合があります。
EntityManager
実行時にユーザーが指定した値からを作成する必要があります
だからこれを使う:
Map addedOrOverridenProperties = new HashMap();
// Let's suppose we are using Hibernate as JPA provider
addedOrOverridenProperties.put("hibernate.show_sql", true);
Persistence.createEntityManagerFactory(<PERSISTENCE_UNIT_NAME_GOES_HERE>, addedOrOverridenProperties);
はい、@Configuration クラス (または同等の spring config xml) 内でこのように spring を使用して xml ファイルを使用せずにできます。
@Bean
public LocalContainerEntityManagerFactoryBean emf(){
properties.put("javax.persistence.jdbc.driver", dbDriverClassName);
properties.put("javax.persistence.jdbc.url", dbConnectionURL);
properties.put("javax.persistence.jdbc.user", dbUser); //if needed
LocalContainerEntityManagerFactoryBean emf = new LocalContainerEntityManagerFactoryBean();
emf.setPersistenceProviderClass(org.eclipse.persistence.jpa.PersistenceProvider.class); //If your using eclipse or change it to whatever you're using
emf.setPackagesToScan("com.yourpkg"); //The packages to search for Entities, line required to avoid looking into the persistence.xml
emf.setPersistenceUnitName(SysConstants.SysConfigPU);
emf.setJpaPropertyMap(properties);
emf.setLoadTimeWeaver(new ReflectiveLoadTimeWeaver()); //required unless you know what your doing
return emf;
}
PersistenceProvider
プレーンな JPA では、実装 (Hibernate など)があると仮定すると、 PersistenceProvider#createContainerEntityManagerFactory(PersistenceUnitInfo info, Map map)メソッドを使用して、EntityManagerFactory
を必要とせずに をブートストラップできpersistence.xml
ます。
ただし、インターフェースを実装しなければならないのは面倒なので、ファイルPersistenceUnitInfo
なしで JPA のブートストラップをサポートする Spring または Hibernate を使用することをお勧めします。persistence.xml
this.nativeEntityManagerFactory = provider.createContainerEntityManagerFactory(
this.persistenceUnitInfo,
getJpaPropertyMap()
);
PersistenceUnitInfoは、Spring 固有のMutablePersistenceUnitInfoクラスによって実装されます。