Ответ 1
Чтобы быть полностью исчерпывающим, все по-другому, если вы используете 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();
Я согласен, что это ужасно, и здесь виноват spec (недостаточно ясно).
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);