EntityManager
S2Hibernate-JPA で Java Persistence API の EntityManager
をどう扱うかが悩ましいです.
要するに instance
属性を singleton
にしていいのか? ってことなんですが.
id:da-yoshi さんが SessionModeTyp
の問題を指摘してくださってますが,Persistence API で許容されている範囲 (AUTO
および COMMIT
) に限定すれば EntityManager
のインスタンスは singleton
として扱ってもちゃんと機能するように思います.
Persistence API で許容されていないモードを使った場合は... 知らない (^^;
もう一つ,AbstractEntityManager
には tx
というフィールドがあって,こっちを見ると...
うーん,厳密に言うとこれを singleton
として使うことはできませんね.
でもでも,これを使うのは JTA を使わず EntityManager
がトランザクションを制御する場合のみ (だよね?).
なので,JTA を前提とする S2Hibernate-JPA 的には問題ではないはず.
そんなわけで (どんなわけで?),現在の Hibernate EntityManager 3.1beta6 では EntityManager
を singleton
にしても大きな問題はないかもしれません.
ただ,Hibernate EntityManager 3.1beta6 ではたまたまそうなっているだけなのか,Persistence API 的にも正しいのかどうかが気になるところ.
もし EntityManager
を singleton
にできないとなると,
public class SingletonDao { private EntityManager entityManage; public setEnttityManager(EntityManager entityManager) { this.entityManager = entityManager; } public Hoge findHoge(int pk) { return entityManager.find(Hoge.class, pk); } }
って書くことができなくなって,
public class SingletonDao { private EntityManagerFactory entityManageFactory; public setEnttityManagerFactory(EntityManagerFactory entityManagerFactory) { this.entityManagerFactory = entityManagerFactory; } public Hoge findHoge(int pk) { return entityManagerFactory.getEntityManager().find(Hoge.class, pk); } }
ってやらないといけなくなります.
従来の DataSource
が EntityManagerFactory
,Connection
が EntityManager
になったんだと思えば許容範囲かもしれませんが...
上のように書きたければ Dao も prototype
にしなきゃいけなくなって,そうすると Dao を利用するサービスなんかも prototype
にしなきゃいけないことに.
サービスを SLSB として実装するなら,こいつは prototype
にマッピングされることになっているので,Dao が prototype
でも問題は微塵もないわけですが...
時代は prototype
?
うーみゅ...
そんなわけで (どんなわけで?),EntityManager
を singleton
にできるかどうかで,それを利用するアプリケーションコンポーネントが大きな影響を受けそうなので,これはとっても大きな問題.
しょうがないから Persistence API のドキュメント読むか...
「Chapter 5 Entity Managers and Persistence Contexts」あたりでしょうか.
id:taedium さん,id:da-yoshi さん,お二人の解釈も聞かせてください.
とりあえず S2Hibernate-JPA EA2 では prototype
でリリースしました.
singleton
の Dao でも prototype
の Dao でも,コンテナ管理の JTA な EntityManager
としてならうまく動くはず.たぶん.