使用EntityManager从EJB访问Hibernate会话

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

我已经尝试过类似的东西:

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

但是只要我在EJB中调用一个方法,我就会得到“在EJB上调用期间发生系统exception”,并带有NullPointerException

我使用glassfish 3.0.1

Bozho和partenon是正确的,但是:

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

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

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

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

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

很简单:

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

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

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