1. ホーム
  2. jpa

[解決済み] persistence.xml設定ファイルを使用しないJPA EntityManagerの作成

2023-05-10 15:24:43

質問

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

これを行う方法についてのどんなアイデアでも、大歓迎です!

どのように解決するのですか?

を初期化する方法はありますか? 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-sourcenon-jta-data-source 要素は JTA および/または非 JTA データソースのグローバル JNDI 名を指定します。 を指定します。

したがって、対象となるアプリケーション・サーバが 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);