如果我有实体管理器,如何获取会话对象?

我有

private EntityManager em;

public List getAll(DetachedCriteria detachedCriteria)   {

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

如果使用的是实体管理器,如何检索会话,或者如何从分离的条件中获取结果?


答案 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。Native Hibernate API),你会做的:

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

答案 2

请参阅“5.1.从 JPA 访问休眠 API“,请参阅《休眠 ORM 用户指南》

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

推荐