Pour être totalement exhaustif, les choses sont différentes si vous utilisez une JPA 1.0 ou JPA 2.0 mise en œuvre.
JPA 1.0
Avec JPA 1.0, vous devez utiliser EntityManager#getDelegate()
. Mais gardez à l'esprit que le résultat de cette méthode est mise en œuvre spécifique, c'est à dire non portable de serveur d'applications à l'aide d'Hibernation pour les autres. Par exemple avec JBoss vous ferait:
org.hibernate.Session session = (Session) manager.getDelegate();
Mais avec GlassFish, que vous avez à faire:
org.hibernate.Session session = ((org.hibernate.ejb.EntityManagerImpl) em.getDelegate()).getSession();
Je suis d'accord, c'est horrible, et le spec est à blâmer ici (pas assez clair).
JPA 2.0
Avec JPA 2.0, il y a une nouvelle (et bien mieux) EntityManager#unwrap(Class<T>)
méthode qui consiste à être préférée à l' EntityManager#getDelegate()
pour les nouvelles applications.
Donc, avec Hibernate comme JPA 2.0 mise en œuvre (voir 3.15. Native API Hibernate), vous voulez faire:
Session session = entityManager.unwrap(Session.class);