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

sto*_*ter 100 java hibernate jpa hibernate-entitymanager

我有

private EntityManager em;

public List getAll(DetachedCriteria detachedCriteria)   {

    return detachedCriteria.getExecutableCriteria( ??? ).list();
}
Run Code Online (Sandbox Code Playgroud)

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

Pas*_*ent 171

要完全详尽,如果您使用JPA 1.0或JPA 2.0实现,情况会有所不同.

JPA 1.0

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

org.hibernate.Session session = (Session) manager.getDelegate();
Run Code Online (Sandbox Code Playgroud)

但是使用GlassFish,你必须这样做:

org.hibernate.Session session = ((org.hibernate.ejb.EntityManagerImpl) em.getDelegate()).getSession(); 
Run Code Online (Sandbox Code Playgroud)

我同意,这太可怕了,这里的规格应该归咎于(不够清楚).

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);
Run Code Online (Sandbox Code Playgroud)

  • 这是Hibernate Session (4认同)
  • `entityManager.unwrap(Session.class);` 什么是 `Session.class` 中的 `Session`?是进口的吗? (2认同)

Vla*_*nov 37

请参阅" Hibernate ORM用户指南 "中的" 5.1.从JPA访问Hibernate API "部分:

Session session = entityManager.unwrap(Session.class);
Run Code Online (Sandbox Code Playgroud)

  • Hibernate手册已更改.第15.8点不再提供有关获取会话的任何信息. (2认同)
  • 截至 2019 年 1 月,Hibernate 当前 (5.3.7) 手册第 5.1 节仍将其声明为获取对 Session 对象的引用的方式。 (2认同)

小智 5

这将更好地解释。

EntityManager em = new JPAUtil().getEntityManager();
Session session = em.unwrap(Session.class);
Criteria c = session.createCriteria(Name.class);
Run Code Online (Sandbox Code Playgroud)