Чтобы быть полностью исчерпывающим, все будет иначе, если вы используете реализацию JPA 1.0 или JPA 2.0.
JPA 1.0
С JPA 1.0 вам придется использовать EntityManager#getDelegate()
. Но имейте в виду, что результат этого метода зависит от реализации, т.е. не переносится с сервера приложений, использующего Hibernate, на другой. Например, с JBoss вы бы сделали:
org.hibernate.Session session = (Session) manager.getDelegate();
Но с GlassFish вам придется:
org.hibernate.Session session = ((org.hibernate.ejb.EntityManagerImpl) em.getDelegate()).getSession();
Я согласен, это ужасно, и здесь виновата спецификация (недостаточно ясная).
JPA 2.0
В JPA 2.0 есть новый (и намного лучший) EntityManager#unwrap(Class<T>)
метод, который предпочтительнее EntityManager#getDelegate()
для новых приложений.
Итак, используя Hibernate как реализацию JPA 2.0 (см. 3.15. Native Hibernate API ), вы должны:
Session session = entityManager.unwrap(Session.class);
((EntityManagerImpl)em).getSession();