DAO med JPA og Spring

1. Oversikt

Denne artikkelen vil vise hvordan du gjør det implementere DAO med Spring og JPA. For kjernen JPA-konfigurasjon, se artikkelen om JPA med Spring.

2. Ingen flere vårmaler

Fra og med våren 3.1, den JpaTemplate og det tilsvarende JpaDaoSupporthar vært utfaset til fordel for å bruke det opprinnelige Java Persistence API.

Begge disse klassene er også bare relevante for JPA 1 (fra JpaTemplate javadoc):

Merk at denne klassen ikke ble oppgradert til JPA 2.0 og vil aldri gjøre det.

Som en konsekvens er det nå best praksis å bruk Java Persistence API direkte i stedet for JpaTemplate.

2.1. Unntaksoversettelse uten malen

Et av ansvarsoppgavene til JpaTemplate var unntak oversettelse - å oversette unntakene på lavt nivå til det generiske unntaket på høyere nivå.

Uten malen, unntak oversettelse er fortsatt aktivert og fullt funksjonell for alle DAO-er merket med @Oppbevaringssted. Spring implementerer dette med en bønnereprosessor som vil gi råd til alle @Oppbevaringssted bønner med alle PersistenceExceptionTranslator funnet i beholderen.

Det er også viktig å merke seg det unntaksoversettelsesmekanismen bruker fullmakter - for at våren skal kunne opprette fullmakter rundt DAO-klassene, må disse ikke erklæres endelig.

3. DAO

Først implementerer vi baselaget for alle DAOene - en abstrakt klasse som bruker generikk og designet for å utvides:

offentlig abstrakt klasse AbstractJpaDAO {private Class clazz; @PersistenceContext EntityManager entityManager; public final void setClazz (Class clazzToSet) {this.clazz = clazzToSet; } offentlig T findOne (lang id) {return entityManager.find (clazz, id); } offentlig liste findAll () {return entityManager.createQuery ("fra" + clazz.getName ()) .getResultList (); } public void create (T entity) {entityManager.persist (entity); } offentlig T-oppdatering (T-enhet) {retur entityManager.merge (enhet); } offentlig ugyldig sletting (T-enhet) {entityManager.remove (enhet); } public void deleteById (long entityId) {T entity = findOne (entityId); slett (enhet); }}

Det viktigste interessante aspektet her er veien de EntityManager blir injisert - bruker standarden @PersistenceContext kommentar. Under panseret håndteres dette av PersistenceAnnotationBeanPostProcessor - som behandler merknaden, henter JPA-enhetsleder fra inneholder og injiserer den.

Persistens-postprosessoren blir enten opprettet eksplisitt ved å definere den i konfigurasjonen eller automatisk, ved å definere kontekst: kommentar-konfigurasjon eller kontekst: komponent-skanning i navneromskonfigurasjonen.

Vær også oppmerksom på at enheten Klasse sendes i konstruktøren som skal brukes i generiske operasjoner:

@Repository public class FooDAO utvider AbstractJPADAO implementerer IFooDAO {public FooDAO () {setClazz (Foo.class); }}

4. Konklusjon

Denne veiledningen illustrert hvordan du setter opp et DAO-lag med Spring og JPA, ved å bruke både XML- og Java-basert konfigurasjon. Vi diskuterte også hvorfor ikke bruke JpaTemplate og hvordan du erstatter den med EntityManager. Det endelige resultatet er en lett, ren DAO-implementering, nesten ikke avhengig av våren.

Implementeringen av dette enkle prosjektet finner du i GitHub-prosjektet - dette er et Maven-basert prosjekt, så det skal være enkelt å importere og kjøre som det er.


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