Bagaimana saya bisa mendapatkan objek sesi jika saya memiliki manajer entitas

107

saya sudah

private EntityManager em;

public List getAll(DetachedCriteria detachedCriteria)   {

    return detachedCriteria.getExecutableCriteria("....").list();
}

Bagaimana saya bisa mengambil sesi jika saya menggunakan manajer entitas atau bagaimana saya bisa mendapatkan hasil dari kriteria saya yang terpisah?

storm_buster
sumber
Lihat juga((EntityManagerImpl)em).getSession();
ashley

Jawaban:

181

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);
Pascal Thivent
sumber
1
entityManager.unwrap(Session.class);apa yang Sessiondi Session.class? apakah ini impor?
Thang Pham
Tergantung pada implementasi JPA, jika Anda menggunakan eclipselinkorg.eclipse.persistence.sessions.Session
albciff
41

Lihat bagian " 5.1. Mengakses API Hibernate dari JPA " di Panduan Pengguna Hibernate ORM :

Session session = entityManager.unwrap(Session.class);
Vladimir Ivanov
sumber
entityManager.unwrap(Session.class);apa yang Sessiondi Session.class? apakah ini impor?
Thang Pham
2
Manual Hibernasi berubah. Poin 15.8 tidak lagi memberikan informasi apa pun tentang mendapatkan sesi.
Nicktar
1
Mulai Januari 2019, manual Hibernate current (5.3.7), §5.1, masih menyatakan ini sebagai cara untuk mendapatkan referensi ke objek Sesi.
Alain BECKER
5

Ini akan menjelaskan lebih baik.

EntityManager em = new JPAUtil().getEntityManager();
Session session = em.unwrap(Session.class);
Criteria c = session.createCriteria(Name.class);
Enio Dantas
sumber
0

'entityManager.unwrap (Session.class)' digunakan untuk mendapatkan sesi dari EntityManager.

@Repository
@Transactional
public class EmployeeRepository {

  @PersistenceContext
  private EntityManager entityManager;

  public Session getSession() {
    Session session = entityManager.unwrap(Session.class);
    return session;
  }

  ......
  ......

}

Tautan Aplikasi Demo .

Hari Krishna
sumber
-1

Saya bekerja di Wildfly tetapi saya menggunakan

org.hibernate.Session session = ((org.hibernate.ejb.EntityManagerImpl) em.getDelegate()).getSession();

dan yang benar adalah

org.hibernate.Session session = (Session) manager.getDelegate();
carlos veintemilla
sumber