理論的には、この問題はまったく同じです。何らかの方法で EntityManager のスコープを開いたままにしない限り、EJB を離れるとエンティティがデタッチされます。(これは、一般的なトピックに関する素晴らしい投稿です: JPA 実装パターン: 遅延読み込み)。
私が読んだブログ投稿から:
8) Open Entity Manager In View サポートはありません。
[...] EJB3 では、エンティティがトランザクション スコープの EntityManager を使用して Bean を離れると、エンティティは永続コンテキストから切り離され、遅延読み込みに依存しなくなります (実際、JPA 仕様ではそのような状況での動作を指定していません。ベンダー依存の例外がスローされます...) もちろん、拡張永続コンテキストでEntityManager を使用することもできます、必要な限りトランザクションと永続化コンテキストを保持します。ただし、この機能は SFSB でのみ使用できますが、DAO クラスは呼び出しを永続化レイヤーにディスパッチするだけなので、ステートレス サービスの典型的な例です。さらに、クライアントごとに専用の DAO Bean インスタンスを用意するのは、やり過ぎのようです。
しかし、それが本当に正しいかどうかはわかりません。私の理解では、を使用してトランザクションを開始およびコミットするサーブレット フィルターを作成できるはずですUserTransaction
(OSIV の通常のフィルターのように)。その後、EJB はフィルタで開始されたトランザクションに参加し、EntityManager
開いたままになります。私はそれをテストしていませんが、試してみることをお勧めします。