Щоб бути повністю вичерпним, все по-іншому, якщо ви використовуєте 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();