DAO s proljećem i hibernacijom

1. Pregled

Ovaj će članak pokazati kako implementirajte DAO s Spring i Hibernate. Za osnovnu konfiguraciju hibernacije, pogledajte prethodni članak Hibernate 5 s Springom.

2. Nema više proljetnih predložaka

Počevši od proljeća 3.0 i hibernacije 3.0.1, Proljeće HibernateTemplate više nije potrebno za upravljanje sjednicom hibernacije. Sada je moguće koristiti kontekstualne sesije - sjednice kojima je izravno upravljao Hibernate i aktivan tijekom opsega transakcije.

Kao posljedica toga, sada je najbolja praksa upotrebljavati Hibernate API izravno umjesto HibernateTemplate. To će učinkovito odvojiti implementaciju DAO sloja od Springa.

2.1. Iznimka prijevod bez HibernateTemplate

Iznimka Prijevod je bila jedna od odgovornosti tvrtke HibernateTemplate - prevođenje iznimki hibernacije niske razine na višu razinu, generičke iznimke proljeća.

Bez predloška, ovaj je mehanizam i dalje omogućen i aktivanza sve DAO-ove označene s @ Repozitorij bilješka. Ispod haube se koristi postprocesor proljetnog graha koji će savjetovati sve @ Repozitorij grah sa svim PersistentExceptionTranslator pronađena u proljetnom kontekstu.

Treba se zapamtiti da prijevod iznimki koristi proxyje. Da bi Spring mogao stvoriti proxyje oko DAO klasa, oni se ne smiju deklarirati kao konačni.

2.2. Hibernate upravljanje sjednicama bez predloška

Kad je izašla podrška za hibernaciju za kontekstualne sesije, HibernateTemplate u biti zastario. Zapravo, Javadoc iz klase sada ističe ovaj aspekt (podebljano od izvornika):

NAPOMENA: Od Hibernate 3.0.1, transakcijski Hibernate pristupni kôd također se može kodirati u običnom hibernacijskom stilu. Stoga za novopokrenute projekte razmislite o tome da umjesto toga usvojite standardni Hibernate3 stil kodiranja objekata za pristup podacima, temeljen na {@link org.hibernate.SessionFactory # getCurrentSession ()}.

3. DAO

Počet ćemo s osnovni DAO - sažetak, parametrizirani DAO koji podržava uobičajene generičke operacije i koji možemo proširiti za svaki entitet:

javni sažetak klase AbstractHibernateDAO {privatna klasa klazz; @Autowired private SessionFactory sessionFactory; javna praznina setClazz (Klasa clazzToSet) {clazz = clazzToSet; } public T findOne (long id) {return (T) getCurrentSession (). get (clazz, id); } javni popis findAll () {return getCurrentSession () .createQuery ("from" + clazz.getName ()) .list (); } javno void spremanje (T entitet) {getCurrentSession (). persist (entitet); } javno ažuriranje T (T entitet) {return (T) getCurrentSession (). merge (entitet); } javno prazno brisanje (T entitet) {getCurrentSession (). delete (entitet); } javna praznina deleteById (dugi id) {konačni T entitet = findOne (id); izbrisati (entitet); } zaštićena završna sesija getCurrentSession () {povratak sessionFactory.getCurrentSession (); }}

Ovdje je zanimljivo nekoliko aspekata - kao što je već rečeno, sažetak DAO ne proširuje nijedan predložak Spring (kao što je HibernateTemplate). Umjesto toga, Hibernate SjednicaTvornica ubrizgava se izravno u DAO i imat će ulogu glavnog Hibernate API-ja, kroz kontekstualni Sjednica izlaže:

this.sessionFactory.getCurrentSession ();

Također imajte na umu da konstruktor prima Razred entiteta kao parametar koji će se koristiti u generičkim operacijama.

Pogledajmo sada primjer provedbe ovog DAO-a, za Foo entitet:

@Repository javna klasa FooDAO proširuje AbstractHibernateDAO implementira IFooDAO {public FooDAO () {setClazz (Foo.class); }}

4. Zaključak

Ovaj je članak obuhvatio konfiguraciju i provedbu sloja postojanosti s Hibernate i Spring.

Razgovarano je o razlozima za prestanak oslanjanja na predloške za sloj DAO, kao i o mogućim zamkama konfiguriranja Proljeća za upravljanje transakcijama i Hibernate Session. Konačni rezultat je lagana, čista DAO implementacija, koja se gotovo ne oslanja na vrijeme kompajliranja na Spring.

Provedbu ovog jednostavnog projekta možete pronaći u projektu github.