web-dev-qa-db-ja.com

persistence.xmlのさまざまなトランザクションタイプの属性

Persistence.xml JPA構成ファイルには、次のような行を含めることができます。

<persistence-unit name="com.nz_war_1.0-SNAPSHOTPU" transaction-type="JTA">

または時々:

<persistence-unit name="com.nz_war_1.0-SNAPSHOTPU" transaction-type=”RESOURCE_LOCAL”>

私の質問は:

違いは何ですか transaction-type="JTA"およびtransaction-type=”RESOURCE_LOCAL”

また、transaction-typeが欠落しているpersistence.xmlファイルもいくつか見つかりました。それが正しいか?

67

デフォルト

デフォルトは、JavaEE環境では[〜#〜] jta [〜#〜]に、JavaSE環境ではRESOURCE_LOCALになります。

RESOURCE_LOCAL

<persistence-unit transaction-type="RESOURCE_LOCAL">を使用すると、EntityManagerPersistenceContext/Cache)の作成と追跡を行うことができます。

  • EntityManagerFactoryを取得するには、EntityManagerを使用する必要があります
  • 結果のEntityManagerインスタンスはPersistenceContext/Cacheです。EntityManagerFactoryは、@PersistenceUnitアノテーションのみを介して注入できます(@PersistenceContextは不可)
  • @PersistenceContextを使用してタイプRESOURCE_LOCALのユニットを参照することはできません。
  • EntityTransactionへのすべての呼び出しを開始/コミットするには、EntityManger APIを使用する必要があります
  • entityManagerFactory.createEntityManager()を2回呼び出すと、2つの別個のEntityManagerインスタンスが生成され、そのため2つの別個のPersistenceContexts/Cachesが生成されます。
  • EntityManagerの複数のインスタンスを使用することは、ほとんど決して良い考えではありません(最初のインスタンスを破棄しない限り、2番目のインスタンスを作成しないでください)

JTA

<persistence-unit transaction-type="JTA">を使用すると、コンテナはEntityManagerPersistenceContext/Cache)の作成と追跡を行います。

  • EntityManagerFactoryを使用してEntityManagerを取得することはできません
  • コンテナが提供するEntityManagerのみを取得できます
  • EntityManagerは、@PersistenceContext注釈のみを使用して注入できます(@PersistenceUnitは不可)
  • タイプJTAのユニットを参照するために@PersistenceUnitを使用することはできません
  • コンテナによって指定されたEntityManagerは、JTAトランザクションに関連付けられたPersistenceContext/Cacheへの参照です。
  • 進行中のJTAトランザクションがない場合、PersistenceContext/Cacheがないため、EntityManagerは使用できません。
  • 同じトランザクション内の同じユニットへのEntityManager参照を持つすべてのユーザーは、自動的に同じPersistenceContext/Cacheへの参照を持ちます。
  • PersistenceContext/CacheはJTAコミット時にフラッシュされクリアされます
110
Jiri Kremser