我有
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,如何获取会话?如何从分离的条件中获取结果?
Answers:
为了完全详尽无遗,如果您使用的是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。本机Hibernate API),您将执行以下操作:
Session session = entityManager.unwrap(Session.class);
entityManager.unwrap(Session.class);
是什么Session
在Session.class
?是进口吗?
org.eclipse.persistence.sessions.Session
请参阅《Hibernate ORM用户指南》中的“ 5.1。从JPA访问Hibernate API ”部分:
Session session = entityManager.unwrap(Session.class);
entityManager.unwrap(Session.class);
是什么Session
在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();
((EntityManagerImpl)em).getSession();