我有
private EntityManager em; public List getAll(DetachedCriteria detachedCriteria) { return detachedCriteria.getExecutableCriteria( ??? ).list(); }
如果正在使用entitymanager,如何检索会话?如何从分离标准中获取结果?
为了完全详尽无遗,如果您使用的是JPA 1.0或JPA 2.0实现,则情况有所不同。
对于JPA 1.0,您必须使用EntityManager#getDelegate()。但是请记住, 此方法的结果是特定 于 实现的, 即从使用Hibernate的应用程序服务器到其他服务器之间不可移植。例如,使用JBoss,您可以执行以下操作:
EntityManager#getDelegate()
org.hibernate.Session session = (Session) manager.getDelegate();
但是,使用GlassFish,您需要执行以下操作:
org.hibernate.Session session = ((org.hibernate.ejb.EntityManagerImpl) em.getDelegate()).getSession();
我同意,这太可怕了,规范归咎于这里(还不够清楚)。
使用JPA 2.0,有一种新的(并且更好)的EntityManager#unwrap(Class<T>)方法比EntityManager#getDelegate()新应用程序更受青睐。
EntityManager#unwrap(Class<T>)
因此,使用Hibernate作为JPA 2.0实现(请参见3.15。本机Hibernate API),您将执行以下操作:
Session session = entityManager.unwrap(Session.class);