web-dev-qa-db-ja.com

entitymanagerがある場合、セッションオブジェクトを取得する方法

私は持っています

private EntityManager em;

public List getAll(DetachedCriteria detachedCriteria)   {

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

Entitymanagerを使用している場合にセッションを取得するにはどうすればよいですか。また、detachedcriteriaから結果を取得するにはどうすればよいですか。

99
storm_buster

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

JPA 1.0

JPA 1.0では、 EntityManager#getDelegate() を使用する必要があります。ただし、このメソッドの結果は実装固有であることに注意してください。休止状態にします。たとえば、 with 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を使用すると( .15。Native Hibernate API を参照)、次のようになります。

Session session = entityManager.unwrap(Session.class);
169
Pascal Thivent
37
Vladimir Ivanov

これはよりよく説明します。

EntityManager em = new JPAUtil().getEntityManager();
Session session = em.unwrap(Session.class);
Criteria c = session.createCriteria(Name.class);
4
Enio Dantas