EntityManager

S2Hibernate-JPAJava Persistence APIEntityManager をどう扱うかが悩ましいです.
要するに 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 では EntityManagersingleton にしても大きな問題はないかもしれません.
ただ,Hibernate EntityManager 3.1beta6 ではたまたまそうなっているだけなのか,Persistence API 的にも正しいのかどうかが気になるところ.


もし EntityManagersingleton にできないとなると,

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);
    }
}

ってやらないといけなくなります.
従来の DataSourceEntityManagerFactoryConnectionEntityManager になったんだと思えば許容範囲かもしれませんが...
上のように書きたければ Dao も prototype にしなきゃいけなくなって,そうすると Dao を利用するサービスなんかも prototype にしなきゃいけないことに.


サービスを SLSB として実装するなら,こいつは prototypeマッピングされることになっているので,Dao が prototype でも問題は微塵もないわけですが...
時代は prototype
うーみゅ...


そんなわけで (どんなわけで?),EntityManagersingleton にできるかどうかで,それを利用するアプリケーションコンポーネントが大きな影響を受けそうなので,これはとっても大きな問題.
しょうがないから Persistence API のドキュメント読むか...
「Chapter 5 Entity Managers and Persistence Contexts」あたりでしょうか.
id:taedium さん,id:da-yoshi さん,お二人の解釈も聞かせてください.


とりあえず S2Hibernate-JPA EA2 では prototype でリリースしました.
singleton の Dao でも prototype の Dao でも,コンテナ管理の JTAEntityManager としてならうまく動くはず.たぶん.