如果我有实体管理器,如何获取会话对象


107

我有

private EntityManager em;

public List getAll(DetachedCriteria detachedCriteria)   {

    return detachedCriteria.getExecutableCriteria("....").list();
}

如果正在使用entitymanager,如何获取会话?如何从分离的条件中获取结果?


又见((EntityManagerImpl)em).getSession();
阿什利

Answers:


181

为了完全详尽无遗,如果您使用的是JPA 1.0或JPA 2.0实现,则情况有所不同。

JPA 1.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

使用JPA 2.0,有一种新的(并且更好)的EntityManager#unwrap(Class<T>)方法比EntityManager#getDelegate()新应用程序更受青睐。

因此,使用Hibernate作为JPA 2.0实现(请参阅3.15。本机Hibernate API),您将执行以下操作:

Session session = entityManager.unwrap(Session.class);

1
entityManager.unwrap(Session.class);是什么SessionSession.class?是进口吗?
唐法(Thang Pham)

取决于JPA实施,如果您使用的是org.eclipse.persistence.sessions.Session
eclipselink

41

请参阅《Hibernate ORM用户指南》中的“ 5.1。从JPA访问Hibernate API ”部分

Session session = entityManager.unwrap(Session.class);

entityManager.unwrap(Session.class);是什么SessionSession.class?是进口吗?
唐法(Thang Pham)

2
休眠手册已更改。点15.8不再提供有关获取会话的任何信息。
Nicktar

1
截至2019年1月,Hibernate当前(5.3.7)手册§5.1仍将其声明为获取对Session对象的引用的方式。
阿兰·贝克


0

'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;
  }

  ......
  ......

}

演示应用程序链接


-1

我在Wildfly中工作,但我正在使用

org.hibernate.Session session = ((org.hibernate.ejb.EntityManagerImpl) em.getDelegate()).getSession();

而正确的是

org.hibernate.Session session = (Session) manager.getDelegate();
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.