116

私は持っている

private EntityManager em;

public List getAll(DetachedCriteria detachedCriteria)   {

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

entitymanager を使用している場合、セッションを取得するにはどうすればよいですか? または、切り離された基準から結果を取得するにはどうすればよいですか?

4

5 に答える 5

193

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

JPA1.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(); 

私は同意します、それはひどいです、そして仕様はここで責任があります (十分に明確ではありません)。

JPA2.0

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

したがって、Hibernate を JPA 2.0 実装として使用する場合 (「3.15. Native Hibernate API 」を参照)、次のようにします。

Session session = entityManager.unwrap(Session.class);
于 2010-11-11T06:14:50.467 に答える
45

Hibernate ORM User Guideのセクション「5.1. Accessing Hibernate APIs from JPA」を参照してください。

Session session = entityManager.unwrap(Session.class);
于 2010-11-10T19:30:40.130 に答える
6

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

EntityManager em = new JPAUtil().getEntityManager();
Session session = em.unwrap(Session.class);
Criteria c = session.createCriteria(Name.class);
于 2016-03-23T23:41:45.873 に答える