私は持っている
private EntityManager em;
public List getAll(DetachedCriteria detachedCriteria) {
return detachedCriteria.getExecutableCriteria("....").list();
}
entitymanager を使用している場合、セッションを取得するにはどうすればよいですか? または、切り離された基準から結果を取得するにはどうすればよいですか?
私は持っている
private EntityManager em;
public List getAll(DetachedCriteria detachedCriteria) {
return detachedCriteria.getExecutableCriteria("....").list();
}
entitymanager を使用している場合、セッションを取得するにはどうすればよいですか? または、切り離された基準から結果を取得するにはどうすればよいですか?
完全に網羅するために、JPA 1.0 または JPA 2.0 実装を使用している場合は状況が異なります。
JPA 1.0 では、 を使用する必要がありますEntityManager#getDelegate()
。ただし 、このメソッドの結果は実装固有であることに注意してください。つまり、Hibernate を使用するアプリケーション サーバーから別のサーバーへの移植性はありません。たとえば、JBoss では次のようにします。
org.hibernate.Session session = (Session) manager.getDelegate();
しかし、 GlassFishでは、次のことを行う必要があります。
org.hibernate.Session session = ((org.hibernate.ejb.EntityManagerImpl) em.getDelegate()).getSession();
私は同意します、それはひどいです、そして仕様はここで責任があります (十分に明確ではありません)。
EntityManager#unwrap(Class<T>)
JPA 2.0 には、新しいアプリケーションよりも優先される新しい (そしてはるかに優れた)メソッドがありEntityManager#getDelegate()
ます。
したがって、Hibernate を JPA 2.0 実装として使用する場合 (「3.15. Native Hibernate API 」を参照)、次のようにします。
Session session = entityManager.unwrap(Session.class);
Hibernate ORM User Guideのセクション「5.1. Accessing Hibernate APIs from JPA」を参照してください。
Session session = entityManager.unwrap(Session.class);
これはよりよく説明します。
EntityManager em = new JPAUtil().getEntityManager();
Session session = em.unwrap(Session.class);
Criteria c = session.createCriteria(Name.class);