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.