Untuk menjadi lengkap, semuanya berbeda jika Anda menggunakan implementasi JPA 1.0 atau JPA 2.0.
JPA 1.0.2
Dengan JPA 1.0, Anda harus menggunakan EntityManager#getDelegate()
. Namun perlu diingat bahwa hasil dari metode ini adalah implementasi spesifik yaitu non portable dari server aplikasi yang menggunakan Hibernate ke yang lain. Misalnya dengan JBoss Anda akan melakukan:
org.hibernate.Session session = (Session) manager.getDelegate();
Tetapi dengan GlassFish , Anda harus melakukan:
org.hibernate.Session session = ((org.hibernate.ejb.EntityManagerImpl) em.getDelegate()).getSession();
Saya setuju, itu mengerikan, dan spek yang harus disalahkan di sini (tidak cukup jelas).
JPA 2.0
Dengan JPA 2.0, ada metode baru (dan jauh lebih baik) EntityManager#unwrap(Class<T>)
yang lebih disukai daripada EntityManager#getDelegate()
untuk aplikasi baru.
Jadi dengan implementasi Hibernate as JPA 2.0 (lihat 3.15. Native Hibernate API ), Anda akan melakukan:
Session session = entityManager.unwrap(Session.class);
((EntityManagerImpl)em).getSession();