如果我有entitymanager,我如何获得会话对象

时间:2010-11-10 19:24:03

标签: java hibernate jpa hibernate-entitymanager

我有

private EntityManager em;

public List getAll(DetachedCriteria detachedCriteria)   {

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

如果使用entitymanager,我如何检索会话?如何从我的detachedcriteria获取结果?

5 个答案:

答案 0 :(得分:165)

如果你使用JPA 1.0或JPA 2.0实现,那么事情就完全不同了。

JPA 1.0

使用JPA 1.0,您必须使用EntityManager#getDelegate()。但请记住, 此方法的结果是特定于实现的 ,即不能从使用Hibernate的应用程序服务器移植到另一个。例如with JBoss你会这样做:

org.hibernate.Session session = (Session) manager.getDelegate();

但是with 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);

答案 1 :(得分:35)

请参阅Hibernate ORM User Guide中的“ 5.1。从JPA访问Hibernate API ”部分:

Session session = entityManager.unwrap(Session.class);

答案 2 :(得分:4)

这将更好地解释。

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

答案 3 :(得分:0)

'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;
  }

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

}

演示应用程序link

答案 4 :(得分:-1)

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

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

正确的是

org.hibernate.Session session = (Session) manager.getDelegate();