entityManagerを持っている場合、セッションオブジェクトを取得するにはどうすればよいですか
-
30-09-2019 - |
質問
私は持っています
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を使用すると、使用する必要があります EntityManager#getDelegate()
. 。しかし、それを覚えておいてください この方法の結果は、実装固有です IEは、hibernateを他のものに使用するアプリケーションサーバーから非ポータブルです。例えば jbossと あなたがするだろう:
org.hibernate.Session session = (Session) manager.getDelegate();
だが ガラス魚と, 、あなたはしなければならないでしょう:
org.hibernate.Session session = ((org.hibernate.ejb.EntityManagerImpl) em.getDelegate()).getSession();
私は同意します、それは恐ろしいことであり、スペックはここで責任を負うことです(十分に明確ではありません)。
JPA 2.0
JPA 2.0では、新しい(そしてはるかに優れています) EntityManager#unwrap(Class<T>)
優先される方法 EntityManager#getDelegate()
新しいアプリケーション用。
したがって、HibernateをJPA 2.0の実装として(参照してください 3.15。ネイティブHibernate API)、あなたはします:
Session session = entityManager.unwrap(Session.class);
他のヒント
セクションを参照してください」5.1。 JPAからHibernate APIにアクセスします" の中に Hibernate ormユーザーガイド:
Session session = entityManager.unwrap(Session.class);
これはよりよく説明されます。
EntityManager em = new JPAUtil().getEntityManager();
Session session = em.unwrap(Session.class);
Criteria c = session.createCriteria(Name.class);
私はWildflyで働いていましたが、使っていました
org.hibernate.Session session = ((org.hibernate.ejb.EntityManagerImpl) em.getDelegate()).getSession();
そして正しいのは
org.hibernate.Session session = (Session) manager.getDelegate();
所属していません StackOverflow