4

JBoss7を使用してJavaEE6ベースのWebアプリケーションを開発しています。私のアプリケーションでは、EJBにEntityManagerを次のように挿入しています。

class ForumServiceEJB
{
    @PersistenceContext(type=EXTENDED)
    private EntityManager em;

}

class TopicServiceEJB
{
    @PersistenceContext(type=EXTENDED)
    private EntityManager em;

}

ForumServiceEJBのEntityManagerを使用して一部のデータを更新すると、変更がDBに反映されますが、TopicServiceEJBのEntityManagerはそれらの変更を確認できず、結果は常にキャッシュからフェッチされます。

エンティティに遅延読み込みタイプの子エンティティコレクションが含まれているため、ExtendedPerssisteenceContextを使用しています。

ExtendedPersistenceContextタイプのEntityManagerを使用/挿入し、1つのEJBで異なるEntityManagerを作成して、他の異なるEJB EntityManagerによって行われた変更を引き続き確認するにはどうすればよいですか?

EntityManagersはReq​​uestScopedオブジェクトである必要があります。

public class MyEntityManagerProducers {
 @Produces @RequestScoped 
 public EntityManager createDbEm() {
   return Persistence.createEntityManagerFactory("forumDb").
          createEntityManager();
 }

 public void disposeUdEm(@Disposes EntityManager em) {
   em.close();
 }

それは行く方法ですか?

4

1 に答える 1

1

エンティティに遅延読み込みタイプの子エンティティコレクションが含まれているため、ExtendedPerssisteenceContextを使用しています。

これは、を使用する適切な理由ではありませんEXTENDED。私はあなたにそれを作ることを提案しますdefault、それはTRANSACTIONです。また、非エンタープライズ環境で、またはアプリケーション管理の永続性を使用する場合は、リクエストスコープまたはメソッドスコープを作成することをおEntityManager勧めします。これは、作成するのにそれほど重いオブジェクトではないためです。さらに、スレッドセーフではないため、アプリケーションスコープのEntityManagerを使用することもお勧めできません。

そうは言っても、JBossを使用しているので、EntityManagerJTAを使用している場合は、コンテナにのライフサイクルを処理させる必要があります。したがって、すべてを注入するだけですdefault

ノート:

ステートフルセッションBeanのみが、コンテナ管理の拡張エンティティマネージャを持つことができます。

リンク:

提案:

ビジネスメソッドは、子をロードするかどうかを知っている必要があります。しかし、それは理想的なケースです。多くの場合、それを言うことはできず、ユーザーの入力に完全に依存します-それをうまく予測することはできません。したがって、利用可能な2つのソリューションがあります。

  1. 子をロードするために別のAJAX呼び出しを行う
  2. open-session-in-viewというフィルターを使用します。前者の方がいいと思います。

リンク:

于 2012-05-25T03:30:31.270 に答える