1. ホーム
  2. java

[解決済み] エンティティマネージャを使用している場合、セッションオブジェクトを取得する方法は?

2022-05-18 05:35:43

質問

私は

private EntityManager em;

public List getAll(DetachedCriteria detachedCriteria)   {

    return detachedCriteria.getExecutableCriteria("....").list();
}

entitymanagerを使用している場合、どのようにセッションを取得できますか?またはどのように私の離脱条件から結果を取得できますか?

どのように解決するのですか?

完全に網羅すると、JPA 1.0の実装を使用している場合とJPA 2.0の実装を使用している場合では、状況が異なります。

JPA 1.0

JPA 1.0を使うと、JPA1.0では EntityManager#getDelegate() . しかし、覚えておいてほしいのは このメソッドの結果は実装に依存します。 つまり、Hibernateを使用するアプリケーションサーバーから他のサーバーへの移植性はありません。例えば をJBossで使用する場合 を使用する場合、次のようになります。

org.hibernate.Session session = (Session) manager.getDelegate();

しかし GlassFishと を、しなければならないでしょう。

org.hibernate.Session session = ((org.hibernate.ejb.EntityManagerImpl) em.getDelegate()).getSession(); 

そうですね、それはひどいですね、ここは仕様が悪い(明確でない)ですね。

JPA 2.0

JPA 2.0では、新しい(そしてはるかに優れた) EntityManager#unwrap(Class<T>) より優先されるメソッド EntityManager#getDelegate() 新しいアプリケーションのために。

そのため、JPA 2.0実装としてのHibernateでは( 3.15. HibernateのネイティブAPI )をするのでしょう。

Session session = entityManager.unwrap(Session.class);