我有
private EntityManager em;
public List getAll(DetachedCriteria detachedCriteria) {
return detachedCriteria.getExecutableCriteria("....").list();
}
如果使用 entitymanager,我如何检索会话,或者如何从我的分离标准中获取结果?
我有
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你会这样做:
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);
请参阅Hibernate ORM 用户指南中的“ 5.1. 从 JPA 访问 Hibernate API ”部分:
Session session = entityManager.unwrap(Session.class);
这将更好地解释。
EntityManager em = new JPAUtil().getEntityManager();
Session session = em.unwrap(Session.class);
Criteria c = session.createCriteria(Name.class);
'entityManager.unwrap(Session.class)' 用于从 EntityManager 获取会话。
@Repository
@Transactional
public class EmployeeRepository {
@PersistenceContext
private EntityManager entityManager;
public Session getSession() {
Session session = entityManager.unwrap(Session.class);
return session;
}
......
......
}
演示应用程序链接。
我在 Wildfly 工作,但我正在使用
org.hibernate.Session session = ((org.hibernate.ejb.EntityManagerImpl) em.getDelegate()).getSession();
正确的是
org.hibernate.Session session = (Session) manager.getDelegate();