DAO dengan Spring dan Hibernate

1. Gambaran keseluruhan

Artikel ini akan menunjukkan cara melaksanakan DAO dengan Spring dan Hibernate . Untuk konfigurasi inti Hibernate, lihat artikel Hibernate 5 sebelumnya dengan Spring.

2. Tiada Lagi Templat Musim Semi

Bermula Spring 3.0 dan Hibernate 3.0.1, Spring HibernateTemplate tidak lagi diperlukan untuk menguruskan Hibernate Session. Sekarang mungkin untuk memanfaatkan sesi kontekstual - sesi yang dikendalikan secara langsung oleh Hibernate dan aktif sepanjang ruang lingkup transaksi.

Akibatnya, kini menjadi amalan terbaik untuk menggunakan Hibernate API secara langsung dan bukannya HibernateTemplate. Ini secara berkesan akan melepaskan pelaksanaan lapisan DAO dari Spring sepenuhnya.

2.1. Terjemahan Pengecualian Tanpa HibernateTemplate

Terjemahan Pengecualian adalah salah satu tanggungjawab HibernateTemplate - menerjemahkan pengecualian Hibernate tahap rendah ke tahap yang lebih tinggi, pengecualian Spring umum.

Tanpa templat, mekanisme ini masih diaktifkan dan aktif untuk semua DAO yang diberi anotasi @Repository . Di bawah tudung, ini menggunakan pemprosesan biji kacang Spring yang akan memberi nasihat kepada semua kacang @Repository dengan semua PersistenceExceptionTranslator yang terdapat dalam konteks Spring.

Satu perkara yang perlu diingat ialah terjemahan pengecualian menggunakan proksi. Agar Spring dapat membuat proksi di sekitar kelas DAO, ini tidak boleh dinyatakan sebagai muktamad .

2.2. Pengurusan Sesi Hibernate Tanpa Templat

Ketika sokongan Hibernate untuk sesi kontekstual keluar, HibernateTemplate pada dasarnya menjadi usang. Sebenarnya, Javadoc kelas sekarang menonjolkan aspek ini (berani dari yang asal):

CATATAN: Pada Hibernate 3.0.1, kod akses Hibernate transaksional juga boleh dikodkan dalam gaya Hibernate biasa. Oleh itu, untuk projek yang baru dimulakan, pertimbangkan untuk menggunakan gaya pengekodan objek akses data Hibernate3 standard, berdasarkan {@link org.hibernate.SessionFactory # getCurrentSession ()}.

3. DAO

Kami akan mulakan dengan DAO asas - DAO abstrak dan parametrized yang menyokong operasi generik biasa dan yang boleh kami laksanakan untuk setiap entiti:

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 dibincangkan, DAO abstrak tidak meluaskan templat Spring (seperti HibernateTemplate ). Sebaliknya, Hibernate SessionFactory disuntikkan secara langsung di DAO, dan akan berperanan sebagai Hibernate API utama, melalui Sesi kontekstual yang didedahkannya:

ini.sessionFactory.getCurrentSession ();

Juga, perhatikan bahawa konstruktor menerima Kelas entiti sebagai parameter yang akan digunakan dalam operasi generik.

Sekarang, mari kita lihat contoh pelaksanaan DAO ini , untuk entiti Foo :

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

4. Kesimpulan

Artikel ini merangkumi konfigurasi dan pelaksanaan lapisan kegigihan dengan Hibernate dan Spring.

Sebab-sebab untuk berhenti bergantung pada templat untuk lapisan DAO telah dibincangkan, serta kemungkinan perangkap mengkonfigurasi Spring untuk menguruskan transaksi dan Hibernate Session. Hasil akhirnya adalah pelaksanaan DAO yang ringan dan bersih, dengan hampir tidak bergantung pada masa kompilasi pada Spring.

Pelaksanaan projek sederhana ini boleh didapati dalam projek github.