116

我有

private EntityManager em;

public List getAll(DetachedCriteria detachedCriteria)   {

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

如果使用 entitymanager,我如何检索会话,或者如何从我的分离标准中获取结果?

4

5 回答 5

193

完全详尽的是,如果您使用的是 JPA 1.0 或 JPA 2.0 实现,情况会有所不同。

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

我同意,这太可怕了,这里应该归咎于规范(不够清楚)。

JPA 2.0

在 JPA 2.0 中,有一种新的(而且更好的)方法对于新应用程序EntityManager#unwrap(Class<T>)来说是首选方法。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 用户指南中的“ 5.1. 从 JPA 访问 Hibernate API ”部分:

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 回答
2

'entityManager.unwrap(Session.class)' 用于从 EntityManager 获取会话。

@Repository
@Transactional
public class EmployeeRepository {

  @PersistenceContext
  private EntityManager entityManager;

  public Session getSession() {
    Session session = entityManager.unwrap(Session.class);
    return session;
  }

  ......
  ......

}

演示应用程序链接

于 2020-03-15T16:57:49.050 回答
-2

我在 Wildfly 工作,但我正在使用

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

正确的是

org.hibernate.Session session = (Session) manager.getDelegate();
于 2019-07-26T21:57:47.737 回答