DAO med forår og dvale

1. Oversigt

Denne artikel viser, hvordan man gør det implementere DAO med Spring og Hibernate. For den centrale dvaletilstandskonfiguration, se den forrige dvaletilstand 5 med Spring-artiklen.

2. Ingen flere forårskabeloner

Fra og med Spring 3.0 og Hibernate 3.0.1, foråret Dvaletilstand er ikke længere nødvendigt til at styre dvale-sessionen. Det er nu muligt at gøre brug af kontekstuelle sessioner - sessioner administreret direkte af dvale og aktiv i hele transaktionens omfang.

Som en konsekvens er det nu bedste praksis at bruge Hibernate API direkte i stedet for Dvaletilstand. Dette vil effektivt afkoble DAO-lagimplementeringen helt fra foråret.

2.1. Undtagelsesoversættelse uden Dvaletilstand

Undtagelse Oversættelse var et af ansvaret for Dvaletilstand - oversættelse af lavt niveau dvaleundtagelser til højere niveau, generiske forårsundtagelser.

Uden skabelonen, denne mekanisme er stadig aktiveret og aktivfor alle DAO'er, der er kommenteret med @Repository kommentar. Under emhætten bruger denne en Spring bean postprocessor, der vil rådgive alle @Repository bønner med alle PersistenceExceptionTranslator fundet i foråret sammenhæng.

En ting at huske er, at undtagelsesoversættelse bruger fuldmagter. For at Spring skal kunne oprette fuldmagter omkring DAO-klasser, må disse ikke erklæres som endelig.

2.2. Hibernate Session Management Uden skabelonen

Da dvaleunderstøttelse af kontekstuelle sessioner kom ud, Dvaletilstand blev i det væsentlige forældet. Faktisk fremhæver klassens Javadoc nu dette aspekt (fed fra originalen):

BEMÆRK: Fra og i dvaletilstand 3.0.1 kan transaktionel dvaletilgangskode også kodes i almindelig dvaletilstand. Derfor skal du for nystartede projekter overveje at vedtage standard Hibernate3-stil til kodning af dataadgangsobjekter i stedet baseret på {@link org.hibernate.SessionFactory # getCurrentSession ()}.

3. DAO

Vi starter med basen DAO - en abstrakt, parametriseret DAO som understøtter de almindelige generiske operationer, og som vi kan udvide til hver enhed:

offentlig abstrakt klasse AbstractHibernateDAO {private Class clazz; @Autowired privat SessionFactory sessionFactory; public void setClazz (Class clazzToSet) {clazz = clazzToSet; } offentlig T findOne (lang id) {return (T) getCurrentSession (). get (clazz, id); } offentlig liste findAll () {return getCurrentSession () .createQuery ("fra" + clazz.getName ()) .liste (); } public void save (T entity) {getCurrentSession (). persist (entity); } offentlig T-opdatering (T-enhed) {return (T) getCurrentSession (). flet (enhed); } offentlig ugyldig sletning (T-enhed) {getCurrentSession (). sletning (enhed); } public void deleteById (long id) {final T entity = findOne (id); slet (enhed); } beskyttet endelig Session getCurrentSession () {return sessionFactory.getCurrentSession (); }}

Et par aspekter er interessante her - som diskuteret udvider den abstrakte DAO ikke nogen Spring-skabelon (som f.eks Dvaletilstand). I stedet dvale SessionFactory injiceres direkte i DAO og har rollen som den vigtigste dvale-API gennem den kontekstuelle Session det udsætter:

this.sessionFactory.getCurrentSession ();

Bemærk også, at konstruktøren modtager Klasse af enheden som en parameter, der skal bruges i de generiske operationer.

Lad os nu se på et eksempel på implementering af denne DAO, for en Foo enhed:

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

4. Konklusion

Denne artikel dækkede konfigurationen og implementeringen af ​​persistenslaget med Hibernate og Spring.

Årsagerne til at stoppe med at stole på skabeloner til DAO-laget blev diskuteret såvel som mulige faldgruber for at konfigurere Spring til at styre transaktioner og dvale-sessionen. 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.