เพื่อให้ครอบคลุมโดยสิ้นเชิงสิ่งต่างๆจะแตกต่างออกไปหากคุณใช้การใช้งาน JPA 1.0 หรือ JPA 2.0
JPA 1.0
ด้วย JPA 1.0 คุณจะต้องใช้EntityManager#getDelegate()
. แต่โปรดทราบว่า ผลลัพธ์ของวิธีนี้คือการนำไปใช้งานเฉพาะเช่นไม่ใช่แบบพกพาจากแอปพลิเคชันเซิร์ฟเวอร์โดยใช้ไฮเบอร์เนตไปยังอีก ตัวอย่างเช่นกับ 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();