3

@PersistenceUnitJPAのJTAで使用できますか? もしそうなら、それはどのように可能ですか?

http://tomee.apache.org/jpa-concepts.htmlごとに:

[ <persistence-unit transaction-type="RESOURCE_LOCAL"> ...]

  • EntityManagerFactory を使用して EntityManager を取得する必要があります
  • [...]
  • EntityManagerFactory は、@PersistenceUnit アノテーションのみを介して注入できます (@PersistenceContext ではありません)。

[ <persistence-unit transaction-type="JTA"> ...]

  • EntityManager は @PersistenceContext アノテーションのみを介して注入できます (@PersistenceUnit ではありません)。

@PersistenceUnit私は、JTA を同時に使用する同様のコードを持っています。NullPointerExceptionしかし、トランザクションにアクセスするときに時々私は持っています(として定義されてい@Resourceます)。

4

2 に答える 2

0

JTA を使用するということは、作業をコンテナーに委譲することを意味します。を使用してオーバーライドできますUserTransaction。あなたの引用には、あなたが知りたいすべての答えが含まれています。を使用PersistenceUnitして取得するEntityManagerことはできません。

を使用している場合は、 を使用RESOURCE_LOCALして、トランザクション自体に責任がありますEntityManager.getTransaction()。エンティティ マネージャは によって作成されますEntityManagerFactory。そのファクトリを取得するには、 を使用できますPersistenceUnit

したがって、コンテナで管理されたエンティティ マネージャに依存している場合、簡単な答えはノーです。

例としてhttp://docs.oracle.com/javaee/6/tutorial/doc/bnbqw.htmlを参照してください

Application Managed Entity Managers =RESOURCE_LOCAL使用できますUserTransaction(JTA の一部です)。

于 2013-04-24T10:58:31.230 に答える
0

エンティティマネージャとはどういう意味ですか??? 私が素朴なプログラマーなら、エンティティを管理するものを単純に解釈できますが、実際、それは同じことを意味します。

ここに画像の説明を入力

Entity Manager は、Entity Manager Factory の助けを借りてインスタンス化されています。データベースへの接続は、エンティティ マネージャによって管理されます。つまり、データベースで操作を実行するための機能が提供されます。したがって、アプリケーションが複数のデータベース接続を必要とする場合、複数の EntityManager インスタンスを構築するための効率的な方法を提供する特定のデータベース用に EntityManagerFactory が構築されると言えます (必要に応じて、エンティティ マネージャーの単一のインスタンスでも、要件に応じてジョブを実行できます)。複数のインスタンスを選択) は、すべての HTTP 要求に必要なそのデータベースに使用します。例を使ってこれを理解します。リレーショナル テーブル B と C を持つ Database : A があるとします。したがって、A については、エンティティ マネージャー ファクトリのインスタンスがインスタンス化されます。ここで、テーブル B の更新を実行したい場合、テーブル C の削除操作を例に挙げると、2 つの異なるエンティティ マネージャーをインスタンス化するか、同じエンティティ マネージャー インスタンスを両方に使用できます。Entity Manager Factory 自体のインスタンス化は効率が悪いと考えられていますが、これは 1 回限りのアクティビティであるため、管理しやすいタスクです。Entity Manager Factory がインスタンス化されると、アプリケーション全体にサービスを提供します。インスタンス化されたエンティティ マネージャーは永続化コンテキストに関連付けられます。

@PersistenceUnit(unitName = "MyDatabase")
EntityManagerFactory emf;
EntityManager entityManager = emf.createEntityManager();

また

@PersistenceContext(unitName = "MyDatabase") 
private EntityManager entityManager;

PersistenceUnit は EntityManagerFactory を注入し、PersistenceContext は EntityManager を注入します。EntityManager ライフサイクルを手動で管理する必要が本当にない限り、通常は PersistenceContext を使用することをお勧めします。EntityManagerFactory は、ファクトリと同様にプロパティのマップを引数として受け取る EntityManager のインスタンス化のための別のメソッドを定義します。このフォームは、EntityManagerFactory のデフォルトのユーザー名とパスワード以外のユーザー名とパスワードを指定する必要がある場合に役立ちます。

Map properties = new HashMap(); 
properties.put("javax.persistence.jdbc.user", "kashyap");
properties.put("javax.persistence.jdbc.password","kashyap"); 
EntityManager em = emf.createEntityManager(properties);

永続化コンテキスト内で、エンティティ インスタンスとそのライフサイクルが管理されます。エンティティ インスタンスとは、エンティティのインスタンスを意味し、各エンティティはデータベース内のリレーショナル テーブルを指定します。Entity Manager は実際には、永続的なエンティティ インスタンスの作成と削除、主キーによるエンティティの検索、およびエンティティのクエリを実行するためのメソッドを提供するインターフェイスであり、これらの機能が一緒に実行する操作の下にグループ化されます。データベースの内容を変更する操作には、アクティブなトランザクションが必要です。トランザクションは、EntityManager から取得した Entity Transaction インスタンスによって管理されます。正確な定義 :- Entity Manager は永続ユニットによって定義されます。持続性ユニットは、アプリケーションによって関連付けられた、またはグループ化されたすべてのクラスのセットを定義します。また、単一のデータベースへのマッピングで同じ場所に配置する必要があります。以下に、理解を深めるためにコードスニペットを書いています:-

try {
        em.getTransaction().begin();
        // Operations that modify the database should come here.
        em.getTransaction
        /**
        *getTransaction() EntityManager's method Return the resource-level EntityTransaction object. See JavaDoc Reference Page
        */
        em.getTransaction().commit();
  }
  finally {
        if (em.getTransaction().isActive())
            em.getTransaction().rollback();
  }

JPA 仕様に従って進めましょう:- 1) 拡張対トランザクション - 範囲指定: デフォルトでは、トランザクション永続コンテキストが使用されます。つまり、現在のトランザクションがコミットされると、すべての変更がフラッシュされ、すべての管理対象エンティティが切り離されます。拡張スコープはステートフル EJB でのみ使用できます。ステートフル Bean は状態を保存できるため、1 つのビジネス メソッドの終了がトランザクションの終了を意味する必要はないと言えるので、完全に理にかなっています。ステートレス Bean では、別の側面があります。ビジネス メソッドが終了すると終了する必要があるビジネス メソッドがあります。===> 1 つのメソッド = 1 つのトランザクション。ステートレス Bean には、トランザクション スコープのエンティティ マネージャーのみが許可されます。

@PersistenceContext (type = javax.persistence.PersistenceContextType.EXTENDED)
    EntityManager emng;

デフォルトでは javax.persistence.PersistenceContextType.TRANSACTION Extended および Transaction Scoped PersistenceContext は、コンテナ管理の EntityManager の場合にのみ許可されます。コンテナ管理 vs アプリケーション管理 2) コンテナ管理 vs アプリケーション管理 :

@PersistenceContext
EntityManager emng;

上記のステートメントは、Container がエンティティ マネージャーを挿入することを許可するため、Container-Managed です。または、EntityManagerFactory を使用して自分で EntityManager を作成することもできますが、今回の注入は少し異なります -

@PersistenceUnit
EntityManagerFactory emf;

EntityManager を取得するには、呼び出す必要があります

emf.createEntityManager();

そしてここにあります - あなたはアプリケーション管理の持続性コンテキストを使用しています。これで、EntityManagers の作成と削除を担当するようになりました。次のパラグラフを読む前に焦点を当ててください。なぜなら、それが絡み合ったコンテキストだからです。私は解決しようとしています。作成された EM を制御したい場合は、createEntityManager を使用できます。 trasaction - コンテナーはそれを行いません。createEntityManager() を呼び出すたびに、新しい PersistenceContext に接続された EntityManager を作成しています。EntityManager の共有に CDI を使用できます。Entity Transaction - JPA and Resource-local に注目してください。詳細な議論が投稿されます。コンテキストについての簡単なアイデアが得られることを願っています。& お気軽に質問を投稿してください。

後編はこちらから

于 2015-12-30T08:31:51.913 に答える