1

私は EJB を扱っています...次のことを行っていますが、注入された EntityManager が期待どおりに機能しない理由がわかりません。

  1. EJB1 は、DB に書き込む EJB2 のメソッドを呼び出します。
  2. EJB2 が戻ると、EJB1 はメッセージを MDB に送信します。
  3. MDB は、DB を読み取り、いくつかの作業を行う EJB3 を呼び出します。

私の問題は、@PersistenceContext を使用して 3 つの EJB すべてに注入された EntityManager が正しく機能していないことです。EJB2 での persist() の呼び出しが、EJB3 で注入された EntityManager に反映されていません。何が間違っている可能性がありますか? 私の問題を十分に明確にしたことを願っています。現在、コンテナ管理のトランザクションを使用しています。

4

1 に答える 1

1

私の問題は、@PersistenceContext を使用して 3 つの EJB すべてに注入された EntityManager が正しく機能していないことです。EJB2 での persist() の呼び出しが、EJB3 で注入された EntityManager に反映されていません。

Java EE 環境では、トランザクション スコープのコンテナー管理エンティティ マネージャーを使用するのが一般的です。また、このようなエンティティ マネージャを使用すると、JTA トランザクションが伝播するにつれて永続化コンテキストが伝播します。

あなたの場合、REQUIRES_NEWEJB3 のメソッドにトランザクション属性を使用していると思われます。そう:

  • を呼び出すEJB3#bar()と、コンテナは開始されたトランザクションを一時停止しEJB2#foo()、新しいトランザクションを開始します
  • からエンティティ マネージャを呼び出すEJB3#bar()と、新しい永続化コンテキストが作成されます。
  • 開始されたトランザクションEJB2#foo()はまだコミットされていないため、変更は新しい永続化コンテキストには「見えません」。

PS: 本当に新しいスレッドを作成しているのですか? はいの場合、少し注意してください。これは EJB 仕様で禁止されています。

于 2010-11-08T14:34:51.673 に答える