DAO dengan Spring dan Hibernate

1. Ikhtisar

Artikel ini akan menunjukkan bagaimana menerapkan DAO dengan Spring dan Hibernate . Untuk konfigurasi inti Hibernate, lihat artikel Hibernate 5 with Spring sebelumnya.

2. Tidak Ada Lagi Template Musim Semi

Mulai Spring 3.0 dan Hibernate 3.0.1, Spring HibernateTemplate tidak lagi diperlukan untuk mengelola Sesi Hibernasi. Sekarang dimungkinkan untuk menggunakan sesi kontekstual - sesi yang dikelola langsung oleh Hibernate dan aktif di seluruh lingkup transaksi.

Akibatnya, sekarang praktik terbaik adalah menggunakan Hibernate API secara langsung sebagai ganti dari HibernateTemplate. Ini secara efektif akan memisahkan implementasi lapisan DAO dari Spring seluruhnya.

2.1. Terjemahan Pengecualian Tanpa HibernateTemplate

Exception Translation adalah salah satu tanggung jawab HibernateTemplate - menerjemahkan pengecualian Hibernate tingkat rendah ke tingkat yang lebih tinggi, pengecualian Musim Semi generik.

Tanpa templat, mekanisme ini masih diaktifkan dan aktif untuk semua DAO yang dianotasi dengan anotasi @Repositori . Di bawah tenda, ini menggunakan postprocessor kacang Spring yang akan menyarankan semua kacang @Repository dengan semua PersistenceExceptionTranslator yang ditemukan dalam konteks Spring.

Satu hal yang perlu diingat adalah terjemahan pengecualian menggunakan proxy. Agar Spring dapat membuat proxy di sekitar kelas DAO, ini tidak boleh dideklarasikan sebagai final .

2.2. Manajemen Sesi Hibernasi Tanpa Template

Ketika dukungan Hibernate untuk sesi kontekstual keluar, Template Hibernate pada dasarnya menjadi usang. Faktanya, Javadoc kelas sekarang menyoroti aspek ini (tebal dari aslinya):

CATATAN: Mulai dari Hibernate 3.0.1, kode akses Hibernate transaksional juga dapat dikodekan dalam gaya Hibernate biasa. Oleh karena itu, untuk proyek yang baru dimulai, pertimbangkan untuk mengadopsi gaya Hibernate3 standar pengkodean objek akses data, berdasarkan {@link org.hibernate.SessionFactory # getCurrentSession ()}.

3. DAO

Kita akan mulai dengan DAO dasar - DAO abstrak dan parametrized yang mendukung operasi umum umum dan yang dapat kita kembangkan untuk setiap entitas:

public abstract class AbstractHibernateDAO{ private Class clazz; @Autowired private SessionFactory sessionFactory; public void setClazz(Class clazzToSet) { clazz = clazzToSet; } public T findOne(long id) { return (T) getCurrentSession().get( clazz, id ); } public List findAll() { return getCurrentSession() .createQuery( "from " + clazz.getName() ).list(); } public void save(T entity) { getCurrentSession().persist( entity ); } public T update(T entity) { return (T) getCurrentSession().merge( entity ); } public void delete(T entity) { getCurrentSession().delete( entity ); } public void deleteById(long id) { final T entity = findOne( id); delete( entity ); } protected final Session getCurrentSession(){ return sessionFactory.getCurrentSession(); } }

Beberapa aspek menarik di sini - seperti yang telah dibahas, DAO abstrak tidak memperluas template Spring (seperti HibernateTemplate ). Sebaliknya, Hibernate SessionFactory disuntikkan langsung ke DAO, dan akan memiliki peran utama Hibernate API, melalui Sesi kontekstual yang diekspos:

this.sessionFactory.getCurrentSession ();

Juga, perhatikan bahwa konstruktor menerima Kelas entitas sebagai parameter yang akan digunakan dalam operasi generik.

Sekarang, mari kita lihat contoh implementasi DAO ini , untuk entitas Foo :

@Repository public class FooDAO extends AbstractHibernateDAO implements IFooDAO{ public FooDAO(){ setClazz(Foo.class ); } }

4. Kesimpulan

Artikel ini membahas konfigurasi dan implementasi lapisan persistensi dengan Hibernate dan Spring.

Alasan untuk berhenti mengandalkan templat untuk lapisan DAO telah dibahas, serta kemungkinan jebakan dalam mengonfigurasi Spring untuk mengelola transaksi dan Sesi Hibernasi. Hasil akhirnya adalah implementasi DAO yang ringan dan bersih, dengan hampir tidak ada ketergantungan waktu kompilasi pada Spring.

Implementasi proyek sederhana ini dapat ditemukan di proyek github.