DAO dengan JPA dan Spring

1. Gambaran keseluruhan

Artikel ini akan menunjukkan cara melaksanakan DAO dengan Spring dan JPA . Untuk konfigurasi JPA teras, lihat artikel mengenai JPA dengan Spring.

2. Tiada Lagi Templat Musim Semi

Bermula dengan Spring 3.1, yang JpaTemplate dan yang sepadan JpaDaoSupport telah dikecam memihak kepada menggunakan Java Kegigihan API asli.

Juga, kedua-dua kelas ini hanya berkaitan dengan JPA 1 (dari JpaTemplate javadoc):

Perhatikan bahawa kelas ini tidak dinaik taraf ke JPA 2.0 dan tidak akan berjaya.

Akibatnya, sekarang adalah praktik terbaik untuk menggunakan Java Persistence API secara langsung dan bukan JpaTemplate .

2.1. Terjemahan Pengecualian Tanpa Templat

Salah satu tanggungjawab JpaTemplate adalah terjemahan pengecualian - menerjemahkan pengecualian tahap rendah ke tahap yang lebih tinggi, pengecualian Spring generik.

Tanpa templat, terjemahan pengecualian masih diaktifkan dan berfungsi sepenuhnya untuk semua DAO yang dianotasikan dengan @Repository . Spring menerapkannya dengan pemprosesan kacang yang akan memberi nasihat kepada semua kacang @Repository dengan semua PersistenceExceptionTranslator yang terdapat di dalam Container.

Penting juga untuk diperhatikan bahawa mekanisme terjemahan pengecualian menggunakan proksi - untuk Spring dapat membuat proksi di sekitar kelas DAO, ini tidak boleh dinyatakan akhir .

3. DAO

Pertama, kami akan melaksanakan lapisan asas untuk semua DAO - kelas abstrak menggunakan generik dan dirancang untuk diperluas:

public abstract class AbstractJpaDAO { private Class clazz; @PersistenceContext EntityManager entityManager; public final void setClazz( Class clazzToSet ){ this.clazz = clazzToSet; } public T findOne( long id ){ return entityManager.find( clazz, id ); } public List findAll(){ return entityManager.createQuery( "from " + clazz.getName() ) .getResultList(); } public void create( T entity ){ entityManager.persist( entity ); } public T update( T entity ){ return entityManager.merge( entity ); } public void delete( T entity ){ entityManager.remove( entity ); } public void deleteById( long entityId ){ T entity = findOne( entityId ); delete( entity ); } }

Aspek menarik utama di sini adalah cara yang EntityManager disuntik - menggunakan standard @PersistenceContext anotasi. Di bawah tudung, ini dikendalikan oleh PersistenceAnnotationBeanPostProcessor - yang memproses anotasi, mengambil pengurus entiti JPA dari isi dan menyuntikkannya.

Pemproses pasca kegigihan dibuat secara eksplisit dengan mendefinisikannya dalam konfigurasi atau secara automatik, dengan menentukan konteks: anotasi-konfigurasi atau konteks: komponen-imbasan dalam konfigurasi ruang nama.

Juga, perhatikan bahawa Kelas entiti dilewatkan dalam konstruktor untuk digunakan dalam operasi generik:

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

4. Kesimpulan

Tutorial ini menggambarkan cara mengatur lapisan DAO dengan Spring dan JPA , menggunakan konfigurasi berasaskan XML dan Java. Kami juga membincangkan mengapa tidak menggunakan JpaTemplate dan cara menggantinya dengan EntityManager . Hasil akhirnya adalah pelaksanaan DAO yang ringan dan bersih, dengan hampir tidak bergantung pada masa kompilasi pada Spring.

Pelaksanaan projek sederhana ini boleh didapati di projek GitHub - ini adalah projek berasaskan Maven, jadi mudah diimport dan dijalankan sebagaimana adanya.