I have
private EntityManager em;
public List getAll(DetachedCriteria detachedCriteria) {
return detachedCriteria.getExecutableCriteria("....").list();
}
如果我使用entitymanager,我该如何检索会话?或者我该如何获取来自我的脱离标准的结果?
如何在使用EntityManager时检索会话或从分离的标准中获取结果?I have
private EntityManager em;
public List getAll(DetachedCriteria detachedCriteria) {
return detachedCriteria.getExecutableCriteria("....").list();
}
如果我使用entitymanager,我该如何检索会话?或者我该如何获取来自我的脱离标准的结果?
如何在使用EntityManager时检索会话或从分离的标准中获取结果?EntityManager#getDelegate()
。但请记住,该方法的结果是与具体实现相关的,即从使用Hibernate的应用服务器到其他服务器之间不可移植。例如,在JBoss上你可以这样做:org.hibernate.Session session = (Session) manager.getDelegate();
org.hibernate.Session session = ((org.hibernate.ejb.EntityManagerImpl) em.getDelegate()).getSession();
EntityManager#unwrap(Class<T>)
方法,对于新应用程序来说,它是首选,而不是EntityManager#getDelegate()
。import org.hibernate.Session;
...
Session session = entityManager.unwrap(Session.class);
entityManager.unwrap(Session.class);
中的 Session
是什么?它是一个导入吗? - Thang Phamorg.eclipse.persistence.sessions.Session
。 - albciffentityManager.unwrap(Session.class)
的存储库类上放置@Transactional
。否则,我会遇到java.lang.IllegalStateException: No transactional EntityManager available
错误。 - Dima Korobskiyimport org.hibernate.Session;
...
Session session = entityManager.unwrap(Session.class);
entityManager.unwrap(Session.class);
中的 Session
是什么?它是一个导入吗? - Thang PhamEntityManager em = new JPAUtil().getEntityManager();
Session session = em.unwrap(Session.class);
Criteria c = session.createCriteria(Name.class);
'entityManager.unwrap(Session.class)' 用于从 EntityManager 中获取 Session。
@Repository
@Transactional
public class EmployeeRepository {
@PersistenceContext
private EntityManager entityManager;
public Session getSession() {
Session session = entityManager.unwrap(Session.class);
return session;
}
......
......
}
演示应用程序 链接.
EntityManager.unwrap()
可能无法正常工作,这是由于Spring的代理行为和Hibernate最近的更改(请参见this Spring issue,已修复但实际上并没有)。
为了使其正常工作,我必须首先使用null
进行双重解包:
/**
* Get the Hibernate {@link Session} behind the given {@link EntityManager}.
*
* @see <a href="https://github.com/spring-projects/spring-framework/issues/19577">Spring Issue #19577</a>
*/
public static Session getHibernateSession(EntityManager entityManager) {
Preconditions.checkArgument(entityManager != null, "null entityManager");
return ((EntityManager)entityManager.unwrap(null)).unwrap(Session.class);
}
我相信这是由于Spring的ExtendedEntityManagerCreator
中代理的unwrap()
方法的处理方式所致:
...
else if (method.getName().equals("unwrap")) {
// Handle JPA 2.0 unwrap method - could be a proxy match.
Class<?> targetClass = (Class<?>) args[0];
if (targetClass == null) {
return this.target;
}
else if (targetClass.isInstance(proxy)) {
return proxy;
}
}
我曾经在Wildfly上工作,但是我使用的是
org.hibernate.Session session = ((org.hibernate.ejb.EntityManagerImpl) em.getDelegate()).getSession();
而正确的写法是
org.hibernate.Session session = (Session) manager.getDelegate();
((EntityManagerImpl)em).getSession();
。 - ashley