Para ser totalmente exaustivo, as coisas são diferentes se você estiver usando uma implementação JPA 1.0 ou JPA 2.0.
JPA 1.0
Com JPA 1.0, você teria que usar EntityManager#getDelegate()
. Mas tenha em mente que o resultado desse método é específico da implementação, ou seja, não é portátil de um servidor de aplicação usando Hibernate para outro. Por exemplo, com o JBoss você faria:
org.hibernate.Session session = (Session) manager.getDelegate();
Mas com GlassFish , você teria que fazer:
org.hibernate.Session session = ((org.hibernate.ejb.EntityManagerImpl) em.getDelegate()).getSession();
Eu concordo, isso é horrível, e a especificação é a culpada aqui (não é clara o suficiente).
JPA 2.0
Com o JPA 2.0, há um EntityManager#unwrap(Class<T>)
método novo (e muito melhor) que deve ser preferido EntityManager#getDelegate()
para novos aplicativos.
Portanto, com o Hibernate como implementação JPA 2.0 (consulte 3.15. API Nativa do Hibernate ), você faria:
Session session = entityManager.unwrap(Session.class);
((EntityManagerImpl)em).getSession();