2010-12-02 11 views
18

¿Es posible obtener el objeto de sesión de Hibernate desde EntityManager? Quiero tener acceso a algunos hibernan API específica ...Acceso a la sesión de Hibernate desde EJB usando EntityManager

ya lo hemos probado algo así como:

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

pero tan pronto como invocar un método en el EJB consigo "una excepción del sistema se produjo durante una invocación de EJB" con una NullPointerException

utilizo GlassFish 3.0.1

Respuesta

26

Bozho y partenon son correctas, pero:

En JPA 2, el mecanismo preferido es entityManager.unwrap(class)

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

Creo que su excepción se produce porque usted está tratando de echar a una clase de implementación (tal vez estabas lidiando con un proxy JDK). Transmitir a una interfaz, y todo debería estar bien (en la versión JPA 2, no se necesita conversión).

+0

+1 para el nuevo mecanismo de – Bozho

+4

aún mejor según lo explicado por @Pascal Thivent aquí http://stackoverflow.com/questions/ 3493495/getting-database-connection-in-pure-jpa-setup puede usar 'em.unwrap (Session.class)' direcly. –

6

tan simple como:

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

Si su EntityManager se inyecta correctamente (utilizando @PersistenceContext) y no es nulo, entonces el siguiente debería funcionar:

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

a partir de documentos Hibernate EntityManager, la forma preferida de hacerlo es:

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