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

我有

private EntityManager em; public List getAll(DetachedCriteria detachedCriteria) { return detachedCriteria.getExecutableCriteria( ??? ).list(); } 

如何使用entitymanager检索会话,或者如何从detachedcriteria中获取结果?

为了完全详尽,如果您使用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。本机Hibernate API ),您可以:

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

请参阅“ Hibernate ORM用户指南 ”中的“ 5.1。从JPA访问Hibernate API ”一节:

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

这会更好地解释。

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