Чтобы быть полностью исчерпывающим, все будет иначе, если вы используете реализацию 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 as JPA 2.0 (см. 3.15. Собственный API Hibernate ), вы должны сделать:
Session session = entityManager.unwrap(Session.class);