Uvod u Spring Data JPA

1. Pregled

Ovaj će se članak usredotočiti na uvođenje Spring Data JPA u proljetni projekt i potpuno konfiguriranje sloja postojanosti. Za detaljni uvod o postavljanju proljetnog konteksta pomoću konfiguracije temeljene na Javi i osnovne Maven pom za projekt, pogledajte ovaj članak.

2. DAO generirani proljetnim podacima - Nema više implementacija DAO-a

Kao što smo raspravljali u ranijem članku, sloj DAO obično se sastoji od puno standardnih kodova koji se mogu i trebaju pojednostaviti. Prednosti takvog pojednostavljenja su brojne: smanjenje broja artefakata koje trebamo definirati i održavati, dosljednost uzoraka pristupa podacima i dosljednost konfiguracije.

Spring Data čini ovo pojednostavljenje jednim korakom naprijed i omogućuje potpuno uklanjanje implementacija DAO-a. Sučelje DAO-a sada je jedini artefakt koji moramo izričito definirati.

Da bi se počelo iskorištavati model programiranja Spring Data s JPA, DAO sučelje mora proširiti JPA specifično Spremište sučelje - JpaRepository. To će omogućiti Spring Data da pronađu ovo sučelje i automatski stvore implementaciju za njega.

Proširenjem sučelja dobivamo najrelevantnije CRUD metode za standardni pristup podacima dostupne u standardnom DAO.

3. Prilagođeni način pristupa i upiti

Kao što je raspravljeno, primjenom jednog od Spremište sučelja, DAO će već definirati i implementirati neke osnovne CRUD metode (i upite).

Da bi definirao specifičnije metode pristupa, Spring JPA podržava prilično nekoliko opcija:

  • jednostavno definirati novu metodu u sučelju
  • pružiti stvarni JPQL upit pomoću @Query bilješka
  • koristite naprednije Specifikacija i podrška za Querydsl u Spring Data
  • definirati prilagođeni upiti putem upita imenovanih JPA

Treća opcija - Specifikacije i podrška za Querydsl - slična je JPA kriterijima, ali koristi fleksibilniji i prikladniji API. To čini čitavu operaciju mnogo čitljivijom i ponovnom uporabom. Prednosti ovog API-ja postat će izraženije kada se radi s velikim brojem fiksnih upita, jer bismo ih mogli sažetije izraziti kroz manji broj blokova za višekratnu upotrebu.

Ova posljednja opcija ima nedostatak što uključuje XML ili opterećenje klase domene upitima.

3.1. Automatski prilagođeni upiti

Kada Spring Data kreira novi Spremište implementaciji, analizira sve metode definirane sučeljima i pokušava automatski generirati upite iz imena metoda. Iako ovo ima određena ograničenja, to je vrlo moćan i elegantan način definiranja novih prilagođenih metoda pristupa s vrlo malo truda.

Pogledajmo primjer: ako entitet ima Ime polje (i standard Java Bean getName i setName metode), mi ćemo definirati findByName metoda u DAO sučelju; ovo će automatski generirati točan upit:

javno sučelje IFooDAO proširuje JpaRepository {Foo findByName (naziv niza); }

Ovo je relativno jednostavan primjer. Mehanizam izrade upita podržava mnogo veći skup ključnih riječi.

U slučaju da parser ne može podudarati svojstvo s poljem objekta domene, vidjet ćemo sljedeću iznimku:

java.lang.IllegalArgumentException: Nije pronađeno ime svojstva za klasu tipa com.baeldung.spring.data.persistence.model.Foo

3.2. Ručni prilagođeni upiti

Pogledajmo sada prilagođeni upit koji ćemo definirati putem @Query napomena:

@Query ("SELECT f FROM Foo f WHERE LOWER (f.name) = LOWER (: name)") Foo retrieveByName (@Param ("name") Naziv niza);

Za još precizniju kontrolu nad stvaranjem upita, poput korištenja imenovanih parametara ili izmjene postojećih upita, referenca je dobro mjesto za početak.

4. Konfiguracija transakcije

Stvarna provedba DAO-a kojim upravlja proljeće zaista je skrivena jer s njim ne radimo izravno. Međutim, ovo je dovoljno jednostavna implementacija - the SimpleJpaRepository - koji definira semantiku transakcija pomoću napomena.

Eksplicitnije, ovdje se koristi samo za čitanje @Transational napomena na razini klase, koja se zatim poništava za metode samo za čitanje. Preostala semantika transakcija je zadana, ali se može lako nadjačati ručno po metodi.

4.1. Prijevod iznimke je živ i zdrav

Pitanje je sada - budući da Spring Data JPA ne ovisi o starim ORM predlošcima (JpaTemplate, HibernateTemplate) i uklonjeni su od proljeća 5 - hoćemo li još uvijek prevesti naše iznimke JPA u Spring DataAccessException hijerarhija?

Naravno, mi smo - prijevod iznimke i dalje je omogućen korištenjem @ Repozitorij napomena na DAO. Ova napomena omogućuje postprocesoru graha Spring da savjetuje sve @ Repozitorij grah sa svim PersistentExceptionTranslator instance pronađene u spremniku i pružaju prijevod izuzetaka baš kao i prije.

Provjerimo prijevod iznimki integracijskim testom:

@Test (očekuje se = DataIntegrityViolationException.class) javna praznina givenFooHasNoName_whenInvalidEntityIsCreated_thenDataException () {service.create (new Foo ()); }

Imajte na umu da prijevod iznimke vrši se preko opunomoćenika. Da bi Spring mogao stvoriti proxyje oko DAO klasa, oni se ne smiju deklarirati konačni.

5. Konfiguracija spremišta JPA podataka podataka

Za aktiviranje podrške za spremište Spring JPA možemo koristiti @EnableJpaRepositories napomena i navedite paket koji sadrži DAO sučelja:

@EnableJpaRepositories (basePackages = "com.baeldung.spring.data.persistence.repository") javna klasa PersistenceConfig {...}

To možemo učiniti s XML konfiguracijom:

6. Java ili XML konfiguracija

Već smo vrlo detaljno razgovarali o tome kako konfigurirati JPA u proljeće u prethodnom članku. Spring Data također koristi prednost Springove podrške za JPA @PersistenceContext bilješka. To koristi za povezivanje EntityManager u grah tvornice Spring odgovoran za stvaranje stvarnih implementacija DAO - JpaRepositoryFactoryBean.

Uz već raspravljenu konfiguraciju, trebamo uključiti i Spring Data XML Config - ako koristimo XML:

@Configuration @EnableTransactionManagement @ImportResource ("classpath *: * springDataConfig.xml") javna klasa PersistenceJPAConfig {...}

7. Ovisnost Mavena

Uz Maven konfiguraciju za JPA, kao u prethodnom članku, dodati ćemo i proljeće-podaci-jpa ovisnost:

 org.springframework.data spring-data-jpa 2.2.7.OSLOBOĐENJE 

8. Korištenje Spring Boot-a

Također možemo koristiti ovisnost Spring Boot Starter Data JPA koja će automatski konfigurirati Izvor podataka za nas.

Također moramo biti sigurni da je baza podataka koju želimo koristiti prisutna na putu predavanja. U naš smo primjer dodali H2 bazu podataka u memoriji:

 org.springframework.boot spring-boot-starter-data-jpa 2.2.6.OSLOBODI com.h2database h2 1.4.200 

Kao rezultat toga, samo radeći ove ovisnosti, naša je aplikacija pokrenuta i možemo je koristiti za druge operacije baze podataka.

Eksplicitna konfiguracija za standardnu ​​aplikaciju Spring sada je uključena kao dio automatske konfiguracije Spring Boot.

Možemo, naravno, izmijeniti automatsku konfiguraciju dodavanjem naše prilagođene eksplicitne konfiguracije.

Spring Boot pruža jednostavan način za to koristeći svojstva u primjena.svojstva datoteka:

spring.datasource.url = jdbc: h2: mem: db; DB_CLOSE_DELAY = -1 spring.datasource.username = sa spring.datasource.password = sa

U ovom smo primjeru promijenili URL veze i vjerodajnice.

9. Zaključak

Ovaj je članak obuhvatio konfiguraciju i implementaciju sloja postojanosti s Spring 5, JPA 2 i Spring Data JPA (dio projekta Spring Data kišobran), koristeći i XML i Java konfiguraciju.

Razgovarali smo o načinima kako definirati više napredni prilagođeni upiti, kao i transakcijska semantikai a konfiguracija s novim jpa prostor imena. Konačni rezultat je novo i elegantno pristupanje podacima s Springom, gotovo bez stvarnog implementacijskog posla.

Provedba ovog JPA vodiča za proljetne podatke nalazi se u projektu GitHub.