DAO med vår og dvalemodus
1. Oversikt
Denne artikkelen vil vise hvordan du gjør det implementere DAO med Spring and Hibernate. For kjernen Hibernate-konfigurasjon, sjekk ut forrige Hibernate 5 with Spring-artikkel.
2. Ingen flere vårmaler
Fra og med våren 3.0 og dvalemodus 3.0.1, våren Dvalemodus er ikke lenger nødvendig å administrere dvalemodus. Det er nå mulig å bruke kontekstuelle økter - økter administrert direkte av dvalemodus og aktiv gjennom hele transaksjonens omfang.
Som en konsekvens er det nå best praksis å bruke Hibernate API direkte i stedet for Dvalemodus. Dette vil effektivt koble DAO-lagimplementeringen helt fra våren.
2.1. Unntak Oversettelse uten Dvalemodus
Unntak Oversettelse var et av ansvarsoppgavene til Dvalemodus - å oversette lavnivå-dvalenes unntak til høyere nivå, generiske unntak fra våren.
Uten malen, denne mekanismen er fortsatt aktivert og aktivfor alle DAO-ene kommentert med @Oppbevaringssted kommentar. Under panseret bruker dette en vårbønner som vil gi råd til alle @Oppbevaringssted bønner med alle PersistenceExceptionTranslator funnet i vår-sammenheng.
En ting å huske er at unntaksoversettelse bruker fullmakter. For at Spring skal kunne opprette fullmakter rundt DAO-klassene, må disse ikke erklæres som endelig.
2.2. Hibernate Session Management Uten malen
Da Dvalemodus-støtte for kontekstuelle økter kom ut, ble Dvalemodus ble i det vesentlige foreldet. Faktisk fremhever Javadoc i klassen dette aspektet (fet fra originalen):
MERKNAD: Fra og i dvalemodus 3.0.1 kan også transaksjonsmessig dvaletilgangskode kodes i vanlig dvalemodus. Derfor, for nylig startede prosjekter, bør du vurdere å vedta standard Hibernate3-stil for koding av datatilgangsobjekter i stedet, basert på {@link org.hibernate.SessionFactory # getCurrentSession ()}.
3. DAO
Vi begynner med basen DAO - en abstrakt, parametrisert DAO som støtter vanlige generiske operasjoner, og som vi kan utvide for hver enhet:
offentlig abstrakt klasse AbstractHibernateDAO {private Class clazz; @Autowired privat SessionFactory sessionFactory; public void setClazz (Class clazzToSet) {clazz = clazzToSet; } offentlig T findOne (lang id) {retur (T) getCurrentSession (). get (clazz, id); } offentlig liste findAll () {return getCurrentSession () .createQuery ("fra" + clazz.getName ()) .list (); } public void save (T entity) {getCurrentSession (). persist (entity); } offentlig T-oppdatering (T-enhet) {retur (T) getCurrentSession (). slå sammen (enhet); } public void delete (T entity) {getCurrentSession (). delete (entity); } public void deleteById (long id) {final T entity = findOne (id); slett (enhet); } beskyttet siste sesjon getCurrentSession () {retur sessionFactory.getCurrentSession (); }}
Noen få aspekter er interessante her - som diskutert, utvider den abstrakte DAO ingen vårmal (som f.eks Dvalemodus). I stedet dvale SessionFactory injiseres direkte i DAO, og vil ha rollen som den viktigste Hibernate API, gjennom den kontekstuelle Økt det avslører:
this.sessionFactory.getCurrentSession ();
Vær også oppmerksom på at konstruktøren mottar Klasse av enheten som en parameter som skal brukes i generiske operasjoner.
La oss nå se på et eksempel på implementering av denne DAO, for en Foo enhet:
@Repository public class FooDAO utvider AbstractHibernateDAO implementerer IFooDAO {public FooDAO () {setClazz (Foo.class); }}
4. Konklusjon
Denne artikkelen dekket konfigurasjonen og implementeringen av utholdenhetslaget med dvalemodus og vår.
Årsakene til å slutte å stole på maler for DAO-laget ble diskutert, samt mulige fallgruver for å konfigurere Spring til å administrere transaksjoner og dvalemodus. 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.