WAS 開発者の皆様、こんにちは。
宣言された persistence-context-ref での JNDI ルックアップが常に新しい EntityManager インスタンスを返すという問題があります。1 つの JTA トランザクション内で、コンテナーが常に同じ EntityManager インスタンスを提供することを期待しています。しかし、1 つのトランザクション内に複数の EntityManager があると、ロックの問題が発生します。さらに、1 つのトランザクション内で (EntityManager ごとに) エンティティが複数回読み込まれる可能性があるため、JPA の使用は最適化されません。
EJB3.1 モジュール内にいくつかの EJB2.1 があるため、JNDI ルックアップと一緒に persistence-context-ref を使用する必要があります。さらに、EntityManager をコンテナー管理したいと考えています。
再現するには、EJB2.1 SessionBean で persistence-context-ref を宣言するだけです。
<persistence-context-ref>
<persistence-context-ref-name>persistence/MyPersistence</persistence-context-ref-name>
<persistence-unit-name>MyPersistence</persistence-unit-name>
</persistence-context-ref>
ここで、開いている JTA トランザクション内で JNDI ルックアップを連続して 2 回行います。
context.lookup("java:comp/env/persistence/MyPersistence")
2 つの異なる EntityManager インスタンスが返されることがわかります。
これは WAS の欠陥ですか?