1

EntityManagerFactoryが EJB で役立つ場合、考えられる状況をいくつか把握しようとしています。もちろん、通常はトランザクション スコープEntityManager(JTA スコープ) だけが必要なため、注入されたすべての EntityManagers は同じ を共有しPersistenceContextます。次の状況で何が起こるか:

  1. いつ@PersistenceContext(type=PersistenceContextType.EXTENDED)使用されますか: これは JTA 対応ですか? そのような EntityManager のリクエストは JTA のコンテキストで実行されますか? そうでない場合、それはどれですか?(注: もちろん、@StatefulEJB でのみ機能します)。もちろん、この場合、EntityManager が独自の/特別な PersistenceContext を持つことは明らかです。

  2. EJB で を使用@PersistenceUnitする場合EntityManagerFactory(すべてのタイプの EJB で機能すると思いますよね?)、取得したものはEntitymanagerJTA 対応ですか (もちろんEntitymanager.joinTransaction()必要です)? Factory からトランザクション スコープ (JTA が有効) または拡張 EntityManager を取得するにはどうすればよいですか? Entitymanager の代わりに Factory を使用すると便利な場合。(もちろん、EntityManagerFactory が Java SE アプリケーションから JPA への唯一のインターフェースであることは明らかですが、EJB はどうでしょうか?)。

4

1 に答える 1

2

あなたの質問は、EJBでEntityManagerFactoryを取得するために@PersistenceUnitを注入する必要がある状況に置かれているという仮定を中心に展開します。さて...ここでいくつかの欠けている背景をナレーションさせてください:

サーブレットの場合

EntityManagerをインスタンス化するには、次の手順を実行する必要がありました。

  1. @PersistenceUnitを挿入して、EntityManagerFactoryを取得します
  2. 次の行を使用します。entityManager=entityManagerFactory.createEntityManager();

上記の2つの手順は、EntityManagerが現在のスレッドに対してローカルであるため、スレッドセーフであることを隔離します。このシナリオは、コンテナインジェクションに関してサーブレットが再入可能になるための回避策でした。つまり、サーブレットは、コンテナによって注入される既存のentityManagerを受け入れます。

EJBの場合

定義上、EJBはコンテナインジェクションに関して再入可能ではないため、コンテナはEJBに対してローカルの新しいentityManagerプロキシをインスタンス化し、スレッドセーフになることがわかっています。

つまり、ExtendedPersistenceContextをいつどのように使用するかについて話し合うことができます。

JPA仕様の294ページのJSR-317を引用します。

コンテナ管理の拡張永続コンテキストは、ステートフルセッションBeanのスコープ内でのみ開始できます。これは、タイプPersistenceContextType.EXTENDEDのエンティティマネージャへの依存関係を宣言するステートフルセッションBeanが作成された時点から存在し、ステートフルセッションBeanにバインドされていると言われます...永続コンテキストは、次の場合にコンテナによって閉じられます。ステートフルセッションBeanの@Removeメソッドが完了します(または、ステートフルセッションBeanインスタンスが破棄されます)。

したがって、非再入可能機能は、ステートフルセッションBeanセマンティクスを提供するためにのみ、属性PersistenceContextType.EXTENDEDを使用して解除できます。ステートフルセッションBeanは、存在する限り、まったく同じEntityManagerを維持する必要があります。

結論として

あなたの最初の質問で:

EntityManagerFactoryがEJBで役立つ可能性があるのはいつですか。

答えは:それは役に立たない。

あなたの2番目の質問に関しては、私は最初の答えと上記の背景のナレーションがそもそもそれを尋ねる必要性を捨てると確信しています!

于 2012-11-21T02:16:26.723 に答える