如果我有EntityManager,我该如何获取会话对象
-
30-09-2019 - |
题
我有
private EntityManager em;
public List getAll(DetachedCriteria detachedCriteria) {
return detachedCriteria.getExecutableCriteria( ??? ).list();
}
如果正在使用EntityManager,我该如何检索会话,或者如何从分离符号中获得结果?
解决方案
为了完全详尽,如果您使用JPA 1.0或JPA 2.0实现,情况会有所不同。
JPA 1.0
使用JPA 1.0,您必须使用 EntityManager#getDelegate()
. 。但是请记住 该方法的结果是特定于实现 即使用Hibernate到另一个从应用程序服务器到另一个。例如 与jboss 你会这样做:
org.hibernate.Session session = (Session) manager.getDelegate();
但 与玻璃鱼, ,您必须做:
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。本地Hibernate API),您会这样做:
Session session = entityManager.unwrap(Session.class);
其他提示
请参阅该部分”5.1。从JPA访问Hibernate API“ 在里面 Hibernate ORM用户指南:
Session session = entityManager.unwrap(Session.class);
这将更好地解释。
EntityManager em = new JPAUtil().getEntityManager();
Session session = em.unwrap(Session.class);
Criteria c = session.createCriteria(Name.class);
我在Wildfly工作,但我正在使用
org.hibernate.Session session = ((org.hibernate.ejb.EntityManagerImpl) em.getDelegate()).getSession();
正确的是
org.hibernate.Session session = (Session) manager.getDelegate();
不隶属于 StackOverflow