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.


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