Para ser totalmente exhaustivo, las cosas son diferentes si está utilizando una implementación JPA 1.0 o JPA 2.0.
JPA 1.0
Con JPA 1.0, tendrías que usar EntityManager#getDelegate()
. Pero tenga en cuenta que el resultado de este método es específico de la implementación, es decir, no portátil del servidor de aplicaciones que usa Hibernate al otro. Por ejemplo, con JBoss haría:
org.hibernate.Session session = (Session) manager.getDelegate();
Pero con GlassFish , tendrías que hacer:
org.hibernate.Session session = ((org.hibernate.ejb.EntityManagerImpl) em.getDelegate()).getSession();
Estoy de acuerdo, eso es horrible, y la especificación es la culpable aquí (no lo suficientemente clara).
JPA 2.0
Con JPA 2.0, hay un EntityManager#unwrap(Class<T>)
método nuevo (y mucho mejor) que es preferible EntityManager#getDelegate()
a las aplicaciones nuevas.
Entonces, con Hibernate como implementación JPA 2.0 (ver 3.15. API de Hibernate nativa ), harías:
Session session = entityManager.unwrap(Session.class);
((EntityManagerImpl)em).getSession();