DAO med JPA og Spring

1. Oversigt

Denne artikel viser, hvordan man gør det implementere DAO med Spring og JPA. For kernens JPA-konfiguration, se artiklen om JPA med Spring.

2. Ingen flere forårskabeloner

Startende med forår 3.1, den JpaTemplate og det tilsvarende JpaDaoSupporthar været forældet til fordel for brug af den oprindelige Java Persistence API.

Begge disse klasser er også kun relevante for JPA 1 (fra JpaTemplate javadoc):

Bemærk, at denne klasse ikke blev opgraderet til JPA 2.0 og aldrig vil.

Som en konsekvens er det nu bedste praksis at Brug Java Persistence API direkte i stedet for JpaTemplate.

2.1. Undtagelsesoversættelse uden skabelon

Et af ansvaret for JpaTemplate var undtagelse oversættelse - oversættelse af undtagelser på lavt niveau til højere, generiske forårsundtagelser.

Uden skabelonen, undtagelsesoversættelse er stadig aktiveret og fuldt funktionel for alle DAO'er, der er kommenteret med @Repository. Spring implementerer dette med en bønnereprocessor, som vil rådgive alle @Repository bønner med alle PersistenceExceptionTranslator findes i beholderen.

Det er også vigtigt at bemærke det undtagelsesoversættelsesmekanismen bruger fuldmagter - for at Spring skal kunne oprette fuldmagter omkring DAO-klasser, skal disse ikke erklæres endelig.

3. DAO

Først implementerer vi basislaget for alle DAO'erne - en abstrakt klasse ved hjælp af generiske og designet til at blive udvidet:

offentlig abstrakt klasse AbstraktJpaDAO {privat klasse clazz; @PersistenceContext EntityManager entityManager; offentlig endelig ugyldig 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-opdatering (T-enhed) {return entityManager.merge (enhed); } offentlig tomrums sletning (T-enhed) {entityManager.remove (enhed); } public void deleteById (long entityId) {T entity = findOne (entityId); slet (enhed); }}

Det vigtigste interessante aspekt her er vejen det EntityManager injiceres - ved hjælp af standarden @PersistenceContext kommentar. Under emhætten håndteres dette af Persistence AnnotationBeanPostProcessor - som behandler annoteringen, henter JPA-enhedsadministratoren fra indeholder og injicerer den.

Persistens-postprocessoren oprettes enten eksplicit ved at definere den i konfigurationen eller automatisk ved at definere kontekst: annotation-config eller kontekst: komponentscanning i namespace-konfigurationen.

Bemærk også, at enheden Klasse sendes i konstruktøren til brug i de generiske operationer:

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

4. Konklusion

Denne tutorial illustreret hvordan man opretter et DAO-lag med Spring og JPA, ved hjælp af både XML- og Java-baseret konfiguration. Vi diskuterede også hvorfor ikke bruge JpaTemplate og hvordan man udskifter det med EntityManager. Det endelige resultat er en let, ren DAO-implementering med næsten ingen kompileringstids afhængighed af foråret.

Implementeringen af ​​dette enkle projekt kan findes i GitHub-projektet - dette er et Maven-baseret projekt, så det skal være let at importere og køre som det er.


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