86

EntityManager永続化ユニットを定義せずに初期化する方法はありますか? エンティティ マネージャーを作成するために必要なすべてのプロパティを指定できますか? EntityManager実行時にユーザーが指定した値からを作成する必要があります。を更新しpersistence.xmlて再コンパイルすることはできません。

これを行う方法についてのアイデアは大歓迎です!

4

7 に答える 7

59

EntityManager永続化ユニットを定義せずに初期化する方法はありますか?

デプロイメント記述子で少なくとも1 つの持続性ユニットを定義する必要があります。persistence.xml

を作成するために必要なすべてのプロパティを指定できますEntitymanagerか?

  • name 属性は必須です。他の属性と要素はオプションです。(JPA仕様)。したがって、これは多かれ少なかれ最小限の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が想定される場合があります。

  • Java SE アプリケーションの移植性を保証するには、永続化ユニット (JPA 仕様) に含まれるマネージド永続化クラスを明示的にリストする必要があります。

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);
于 2010-01-02T07:51:48.593 に答える
29

はい、@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;
}
于 2012-08-26T01:15:03.970 に答える
8

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クラスによって実装されます。

于 2016-09-20T13:18:26.090 に答える