Nói một cách tổng thể, mọi thứ sẽ khác nếu bạn đang sử dụng triển khai JPA 1.0 hoặc JPA 2.0.
JPA 1.0
Với JPA 1.0, bạn phải sử dụng EntityManager#getDelegate()
. Nhưng hãy nhớ rằng kết quả của phương pháp này là triển khai cụ thể, tức là không di động từ máy chủ ứng dụng bằng chế độ Hibernate sang máy chủ khác. Ví dụ với JBoss bạn sẽ làm:
org.hibernate.Session session = (Session) manager.getDelegate();
Nhưng với GlassFish , bạn phải làm:
org.hibernate.Session session = ((org.hibernate.ejb.EntityManagerImpl) em.getDelegate()).getSession();
Tôi đồng ý, điều đó thật kinh khủng, và thông số kỹ thuật đáng trách ở đây (không đủ rõ ràng).
JPA 2.0
Với JPA 2.0, có một EntityManager#unwrap(Class<T>)
phương pháp mới (và tốt hơn nhiều) được ưu tiên hơn EntityManager#getDelegate()
cho các ứng dụng mới.
Vì vậy, với triển khai Hibernate dưới dạng JPA 2.0 (xem 3.15. API Hibernate Native ), bạn sẽ thực hiện:
Session session = entityManager.unwrap(Session.class);
((EntityManagerImpl)em).getSession();