使用EntityManager从EJB访问Hibernate会话

时间:2010-12-02 13:35:36

标签: java hibernate jpa java-ee glassfish-3

是否可以从EntityManager获取Hibernate Session对象?我想访问一些特定于hibernate的API ...

我已尝试过类似的内容:

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

但是当我在EJB中调用一个方法时,我得到“在EJB上调用期间发生系统异常”,并带有NullPointerException

我使用glassfish 3.0.1

4 个答案:

答案 0 :(得分:26)

Bozhopartenon是正确的,但是:

在JPA 2中,首选机制是entityManager.unwrap(class)

HibernateEntityManager hem = em.unwrap(HibernateEntityManager.class);
Session session = hem.getSession();

我认为你的异常是因为你试图强制转换为实现类(也许你正在处理JDK代理)。转换为接口,一切都应该没问题(在JPA 2版本中,不需要转换)。

答案 1 :(得分:12)

从Hibernate EntityManager文档中,首选的方法是:

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

答案 2 :(得分:6)

简单如下:

Session session = (Session) em.getDelegate();

答案 3 :(得分:6)

如果EntityManager已正确注入(使用@PersistenceContext)并且不为空,则以下内容应该有效:

org.hibernate.Session hSession = (Session) em.getDelegate();