DAO s JPA a jar
1. Prehľad
Tento článok ukáže, ako na to implementovať DAO s jarou a JPA. Informácie o základnej konfigurácii JPA nájdete v článku o JPA s pružinou.
2. Už žiadne jarné šablóny
Počnúc jarom 3.1 JpaTemplate a prisl JpaDaoSupportbol zastarané v prospech používania natívneho rozhrania Java Persistence API.
Obe tieto triedy sú takisto relevantné iba pre JPA 1 (z JpaTemplate javadoc):
Upozorňujeme, že táto trieda nebola upgradovaná na JPA 2.0 a nikdy nebude.
V dôsledku toho je teraz najlepšou praxou použite priamo API Java Persistence namiesto JpaTemplate.
2.1. Výnimkový preklad bez šablóny
Jednou z povinností spoločnosti JpaTemplate bol preklad výnimky - preklad nízkoúrovňových výnimiek na vyššiu úroveň, všeobecné jarné výnimky.
Bez šablóny, preklad výnimiek je stále povolený a plne funkčný pre všetky DAO anotované s @Úložisko. Jar to implementuje pomocou fazuľového postprocesora, ktorý poradí všetkým @Úložisko fazuľa so všetkým PersistenceExceptionTranslator sa nachádza v kontajneri.
Je tiež dôležité poznamenať, že mechanizmus prekladu výnimiek používa proxy - aby Spring mohla vytvárať proxy okolo tried DAO, tieto sa nesmú deklarovať konečné.
3. DAO
Najskôr implementujeme základnú vrstvu pre všetky DAO - abstraktnú triedu používajúcu všeobecné a navrhnutú na rozšírenie:
verejná abstraktná trieda AbstractJpaDAO {private Class clazz; @PersistenceContext EntityManager entityManager; public final void setClazz (Class clazzToSet) {this.clazz = clazzToSet; } verejné T findOne (dlhé id) {návrat entityManager.find (clazz, id); } public List findAll () {return entityManager.createQuery ("from" + clazz.getName ()) .getResultList (); } public void create (T entita) {entityManager.persist (entita); } verejná aktualizácia T (entita T) {návrat entityManager.merge (entita); } public void delete (entita T) {entityManager.remove (entita); } public void deleteById (long entityId) {T entity = findOne (entityId); vymazať (entita); }}
Hlavným zaujímavým aspektom je tu cesta the EntityManager sa vstrekuje - pomocou štandardu @PersistenceContext anotácia. Pod kapotou to rieši PersistenceAnnotationBeanPostProcessor - ktorý spracuje anotáciu, načíta správcu entity JPA z obsahuje a vloží ju.
Perzistenčný postprocesor sa vytvára buď explicitne definovaním v konfigurácii, alebo automaticky definovaním kontext: anotácia-konfigurácia alebo kontext: skenovanie komponentov v konfigurácii menného priestoru.
Upozorňujeme tiež, že účtovná jednotka Trieda sa odovzdáva v konštruktore, ktorý sa má použiť v generických operáciách:
@Repository public class FooDAO extends AbstractJPADAO implementuje IFooDAO {public FooDAO () {setClazz (Foo.class); }}
4. Záver
Tento návod je ilustrovaný ako nastaviť vrstvu DAO s Spring a JPApomocou konfigurácie založenej na protokole XML aj Java. Diskutovali sme tiež o tom, prečo nepoužívať JpaTemplate a ako ho nahradiť EntityManager. Konečným výsledkom je ľahká a čistá implementácia DAO, ktorá sa takmer vôbec nespolieha na jar pri kompilácii.
Implementáciu tohto jednoduchého projektu nájdete v projekte GitHub - jedná sa o projekt založený na Maven, takže by malo byť ľahké ho importovať a spustiť tak, ako je.