DAO s JPA i proljeće

1. Pregled

Ovaj će članak pokazati kako implementirati DAO s Springom i JPA. Osnovnu JPA konfiguraciju potražite u članku o JPA s Springom.

2. Nema više proljetnih predložaka

Počevši od proljeća 3.1, JpaTemplate i odgovarajuće JpaDaoPodrškabio je zastarjelo u korist korištenja izvornog API-ja Java Persistence.

Također su obje ove klase relevantne samo za JPA 1 (iz JpaTemplate javadoc):

Imajte na umu da se ova klasa nije nadogradila na JPA 2.0 i da nikada neće.

Kao posljedica toga, to je sada najbolja praksa izravno koristite Java Persistent API umjesto JpaTemplate.

2.1. Prijevod iznimke bez predloška

Jedna od odgovornosti JpaTemplate bio prijevod iznimke - prevođenje iznimaka na nižoj razini na više, općenite izuzeci za proljeće.

Bez predloška, prijevod iznimke i dalje je omogućen i potpuno funkcionalan za sve DAO s bilješkama @ Repozitorij. Spring to primjenjuje s postprocesorom graha koji će savjetovati sve @ Repozitorij grah sa svim PersistentExceptionTranslator pronađen u Spremniku.

Također je važno napomenuti da mehanizam za prevođenje izuzetaka koristi proksije - da bi Spring mogao stvoriti proxyje oko DAO klasa, oni se ne smiju deklarirati konačni.

3. DAO

Prvo ćemo implementirati osnovni sloj za sve DAO-ove - apstraktnu klasu koja koristi generike i dizajniranu za proširenje:

javni sažetak klase AbstractJpaDAO {private Class clazz; @PersistenceContext EntityManager entityManager; javna konačna praznina setClazz (Klasa clazzToSet) {this.clazz = clazzToSet; } javni T findOne (dugi id) {return entityManager.find (clazz, id); } javni popis findAll () {return entityManager.createQuery ("from" + clazz.getName ()) .getResultList (); } javna void stvoriti (T entitet) {entityManager.persist (entitet); } javno ažuriranje T (T entitet) {return entityManager.merge (entitet); } javno prazno brisanje (T entitet) {entityManager.remove (entitet); } javna praznina deleteById (long entityId) {T entitet = findOne (entityId); izbrisati (entitet); }}

Glavni zanimljiv aspekt ovdje je put the EntityManager se injektira - koristeći standard @PersistenceContext bilješka. Ispod poklopca motora to rješava PersistenceAnnotationBeanPostProcessor - koji obrađuje napomenu, dohvaća upravitelja entiteta JPA iz sadržaja i ubacuje je.

Postprocesor postojanosti izrađuje se eksplicitno definiranjem u konfiguraciji ili automatski definiranjem kontekst: napomena-konfiguracija ili kontekst: komponenta-skeniranje u konfiguraciji prostora imena.

Također imajte na umu da je entitet Razred se predaje u konstruktoru koji će se koristiti u generičkim operacijama:

@Repository javna klasa FooDAO proširuje AbstractJPADAO implementira IFooDAO {public FooDAO () {setClazz (Foo.class); }}

4. Zaključak

Ovaj vodič ilustriran kako postaviti DAO sloj s Springom i JPA, koristeći XML i Java konfiguraciju. Također smo razgovarali o tome zašto ne koristiti JpaTemplate i kako ga zamijeniti s EntityManager. Konačni rezultat je lagana, čista DAO implementacija, koja se gotovo ne oslanja na vrijeme kompajliranja na Spring.

Provedbu ovog jednostavnog projekta možete pronaći u projektu GitHub - ovo je projekt zasnovan na Mavenu, pa bi ga trebalo lako uvesti i pokrenuti kakav jest.


$config[zx-auto] not found$config[zx-overlay] not found