Saya baru mengenal Hibernate dan saya tidak yakin apakah akan menggunakan Hibernate SessionFactory
atau JPA EntityManagerFactory
untuk membuat Hibernate Session
.
Apa perbedaan antara keduanya? Apa pro & kontra menggunakan masing-masing?
Saya baru mengenal Hibernate dan saya tidak yakin apakah akan menggunakan Hibernate SessionFactory
atau JPA EntityManagerFactory
untuk membuat Hibernate Session
.
Apa perbedaan antara keduanya? Apa pro & kontra menggunakan masing-masing?
Jawaban:
Lebih suka
EntityManagerFactory
danEntityManager
. Mereka didefinisikan oleh standar JPA.SessionFactory
danSession
khusus untuk hibernasi. TheEntityManager
memanggil sesi hibernasi di bawah tenda. Dan jika Anda memerlukan beberapa fitur spesifik yang tidak tersedia diEntityManager
, Anda dapat memperoleh sesi dengan menelepon:sumber
Session
dariEntityManager
, sama denganSessionFactory.getCurrentSession()
? Maksud saya, apakah itu akan terbuka baruSession
jika belum dibuat? Bagaimana cara kerjanya di lingkungan multithreaded?Saya ingin menambahkan ini bahwa Anda juga bisa mendapatkan sesi Hibernate dengan memanggil
getDelegate()
metode dariEntityManager
.ex:
sumber
unwrap()
ini lebih disukai lebihgetDelegate()
sesuai dengan docs java: JavaEE 6 , dan JavaEE 7 .Saya lebih suka JPA2
EntityManager
API daripadaSessionFactory
, karena rasanya lebih modern. Satu contoh sederhana:JPA:
SessionFactory:
Saya pikir sudah jelas bahwa yang pertama terlihat lebih bersih dan juga lebih mudah untuk diuji karena EntityManager dapat dengan mudah diejek.
sumber
return sessionFactory.getCurrentSession().createQuery("from User where id=1").list()
Menggunakan pendekatan EntityManagerFactory memungkinkan kita untuk menggunakan anotasi metode panggilan balik seperti @PrePersist, @ PostPersist, @ PreUpdate tanpa konfigurasi tambahan.
Menggunakan panggilan balik yang serupa saat menggunakan SessionFactory akan membutuhkan upaya ekstra.
Dokumen hibernasi terkait dapat ditemukan di sini dan di sini .
Pertanyaan SOF terkait dan diskusi Forum Musim Semi
sumber
SessionFactory
vs.EntityManagerFactory
Seperti yang saya jelaskan dalam Panduan Pengguna Hibernate , Hibernate
SessionFactory
memperluas JPAEntityManagerFactory
, seperti yang diilustrasikan oleh diagram berikut:Jadi,
SessionFactory
ini juga merupakan JPAEntityManagerFactory
.Baik
SessionFactory
danEntityManagerFactory
metadata pemetaan entitas dan memungkinkan Anda untuk membuat HibernateSession
atauEntityManager
.Session
vs.EntityManager
Sama seperti
SessionFactory
danEntityManagerFactory
, HibernateSession
memperluas JPAEntityManager
. Jadi, semua metode yang ditentukan olehEntityManager
tersedia di HibernateSession
.The
Session
dan `EntityManager menerjemahkan transisi status entitas ke dalam pernyataan SQL, seperti SELECT, INSERT, UPDATE, dan DELETE.Hibernate vs. JPA bootstrap
Saat mem-bootstrap aplikasi JPA atau Hibernate, Anda memiliki dua pilihan:
SessionFactory
viaBootstrapServiceRegistryBuilder
. Jika Anda menggunakan Spring, bootstrap Hibernate dilakukan melaluiLocalSessionFactoryBean
, seperti yang diilustrasikan oleh contoh GitHub ini .EntityManagerFactory
melaluiPersistence
kelas atauEntityManagerFactoryBuilder
. Jika Anda menggunakan Spring, bootstrap JPA dilakukan melaluiLocalContainerEntityManagerFactoryBean
, seperti yang diilustrasikan oleh contoh GitHub ini .Bootstrap melalui JPA lebih disukai. Itu karena JPA
FlushModeType.AUTO
adalah pilihan yang jauh lebih baik daripada warisanFlushMode.AUTO
, yang memecah konsistensi baca-Anda-tulis untuk kueri SQL asli .Bongkar JPA untuk Hibernate
Juga, jika Anda bootstrap melalui JPA, dan Anda telah menyuntikkan
EntityManagerFactory
melalui@PersistenceUnit
anotasi:Anda dapat dengan mudah mendapatkan akses ke dasar
Sessionfactory
menggunakanunwrap
metode:Hal yang sama dapat dilakukan dengan JPA
EntityManager
. Jika Anda menyuntikkanEntityManager
melalui@PersistenceContext
anotasi:Anda dapat dengan mudah mendapatkan akses ke dasar
Session
menggunakanunwrap
metode:Kesimpulan
Jadi, Anda harus mem-bootstrap melalui JPA, menggunakan
EntityManagerFactory
danEntityManager
, dan hanya membuka mereka ke antarmuka Hibernate terkait ketika Anda ingin mendapatkan akses ke beberapa metode khusus Hibernate yang tidak tersedia di JPA, seperti mengambil entitas melalui pengidentifikasi alami .sumber
Dengan menggunakan EntityManager, kode tidak lagi dipasangkan dengan hibernate. Namun untuk ini, dalam penggunaannya kita harus menggunakan:
dari pada
Demikian pula, untuk EntityManagerFactory, gunakan antarmuka javax. Dengan begitu, kodenya secara longgar digabungkan. Jika ada implementasi JPA 2 yang lebih baik daripada hibernate, beralih akan mudah. Dalam kasus ekstrim, kita bisa mengetikkan cast ke HibernateEntityManager.
sumber
EntityManagerFactory adalah implementasi standar, itu sama di semua implementasi. Jika Anda memigrasikan ORM Anda ke penyedia lain seperti EclipseLink, tidak akan ada perubahan dalam pendekatan untuk menangani transaksi. Sebaliknya, jika Anda menggunakan pabrik sesi hibernate, itu terkait dengan API hibernasi dan tidak dapat bermigrasi ke vendor baru.
sumber
Antarmuka EntityManager mirip dengan sessionFactory di hibernasi. EntityManager di bawah paket javax.persistance tetapi sesi dan sessionFactory di bawah paket org.hibernate.Session / sessionFactory.
Manajer entitas adalah spesifik JPA dan session / sessionFactory spesifik untuk hibernasi.
sumber