一尘不染

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

hibernate

我有

private EntityManager em;

public List getAll(DetachedCriteria detachedCriteria)   {

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

如果正在使用entitymanager,如何检索会话?如何从分离标准中获取结果?


阅读 253

收藏
2020-06-20

共1个答案

一尘不染

为了完全详尽无遗,如果您使用的是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);
2020-06-20