如果我有实体管理器,如何获取会话对象?
2022-08-31 08:59:59
我有
private EntityManager em;
public List getAll(DetachedCriteria detachedCriteria) {
return detachedCriteria.getExecutableCriteria("....").list();
}
如果使用的是实体管理器,如何检索会话,或者如何从分离的条件中获取结果?
我有
private EntityManager em;
public List getAll(DetachedCriteria detachedCriteria) {
return detachedCriteria.getExecutableCriteria("....").list();
}
如果使用的是实体管理器,如何检索会话,或者如何从分离的条件中获取结果?
为了完全详尽起见,如果您使用的是 JPA 1.0 或 JPA 2.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 中,有一个新的(而且更好的)EntityManager#unwrap(Class<T>)
方法,对于新应用程序来说,它比 EntityManager#getDelegate()
更可取。
因此,使用Hibernate作为JPA 2.0实现(参见3.15。Native Hibernate API),你会做的:
Session session = entityManager.unwrap(Session.class);
请参阅“5.1.从 JPA 访问休眠 API“,请参阅《休眠 ORM 用户指南》:
Session session = entityManager.unwrap(Session.class);