CrudRepository, JpaRepository i PagingAndSortingRepository u Spring Data

1. Pregled

U ovom ćemo se kratkom članku usredotočiti na različite vrste sučelja spremišta podataka Spring i njihove funkcionalnosti. Dotaknut ćemo se:

  • CrudRepository
  • PagingAndSortingRepository
  • JpaRepository

Jednostavno rečeno, svako spremište u Spring Datau proširuje generičko Spremište sučelje, ali osim toga, svaki od njih ima različitu funkcionalnost.

2. Proljetna spremišta podataka

Krenimo od JpaRepositorija - koji se proteže PagingAndSortingRepository i, pak, CrudRepository.

Svaka od njih definira vlastitu funkcionalnost:

  • CrudRepository pruža CRUD funkcije
  • PagingAndSortingRepository pruža metode paginiranja i sortiranja zapisa
  • JpaRepository pruža metode povezane s JPA-om, poput ispiranja konteksta postojanosti i brisanja zapisa u paketu

I tako, zbog ovog nasljednog odnosa, JpaRepository sadrži puni API od CrudRepository i PagingAndSortingRepository.

Kada nam nije potrebna puna funkcionalnost koju pruža JpaRepository i PagingAndSortingRepository, možemo jednostavno koristiti CrudRepository.

Pogledajmo sada brzi primjer za bolje razumijevanje ovih API-ja.

Počet ćemo s jednostavnim Proizvod entitet:

@ Entitet javne klase Proizvod {@ Id privatni dugi ID; privatni naziv niza; // geteri i postavljači}

I provedimo jednostavnu operaciju - pronađite a Proizvod na osnovu njegovog imena:

@Repository javno sučelje ProductRepository proširuje JpaRepository {Product findByName (String productName); }

To je sve. Spremište podataka Spring automatski će generirati implementaciju na temelju imena koje smo mu dali.

Ovo je naravno bio vrlo jednostavan primjer; ovdje možete dublje ući u Spring Data JPA.

3. CrudRepository

Pogledajmo sada kod za CrudRepository sučelje:

javno sučelje CrudRepository proširuje Spremište {S spremi (S entitet); T findOne (ID primarni ključ); Iterable findAll (); Dugo brojanje (); brisanje praznine (T entitet); logička vrijednost postoji (ID primaryKey); }

Primijetite tipičnu CRUD funkcionalnost:

  • spremi (…) - save an Iterativ entiteta. Ovdje možemo proslijediti više objekata kako bismo ih spremili u paketu
  • findOne (…) - dobiti jedan entitet na temelju prenesene vrijednosti primarnog ključa
  • findAll () - dobiti Iterativ svih dostupnih entiteta u bazi podataka
  • brojati () - return broj ukupnih entiteta u tablici
  • izbrisati(…) - izbrišite entitet na temelju prosljeđenog objekta
  • postoji (...) - provjeriti postoji li entitet na temelju proslijeđene vrijednosti primarnog ključa

Ovo sučelje izgleda prilično generički i jednostavno, ali zapravo pruža sve osnovne apstrakcije upita potrebne u aplikaciji.

4. PagingAndSortingRepository

Sada, pogledajmo još jedno sučelje spremišta, koje se proširuje CrudRepository:

javno sučelje PagingAndSortingRepository proširuje CrudRepository {Iterable findAll (sortiranje sortiraj); Stranica findAll (stranica koja se može stranicati); }

Ovo sučelje pruža metodu findAll (dostupno za stranicu), što je ključno za provedbu Paginacija.

Prilikom korištenja Pageable, mi stvaramo Pageable objekt s određenim svojstvima, a mi moramo navesti barem:

  1. Veličina stranice
  2. Broj trenutne stranice
  3. Sortiranje

Dakle, pretpostavimo da želimo prikazati prvu stranicu skupa rezultata poredanih po prezime, uzlazno, s najviše pet zapisa. Tako to možemo postići pomoću a Zahtjev za stranicu i a Vrsta definicija:

Sortiranje sortiranje = novo Sortiranje (novo Sortiranje.Nalog (Direction.ASC, "lastName")); Pageable pageable = new PageRequest (0, 5, sortiranje);

Prosljeđivanje objekta koji se može stranicati na upit podataka Spring, vratit će dotične rezultate (prvi parametar Zahtjev za stranicu temelji se na nuli).

5. JpaRepository

Napokon ćemo pogledati JpaRepository sučelje:

javno sučelje JpaRepository proširuje PagingAndSortingRepository {Lista findAll (); Popis findAll (sortiranje); Spremi popis (Iterable entiteti); ispiranje praznine (); T saveAndFlush (T entitet); void deleteInBatch (Iterable entiteti); }

Ponovimo, pogledajmo ukratko svaku od ovih metoda:

  • findAll () - dobiti Popis svih dostupnih entiteta u bazi podataka
  • findAll (…) - dobiti Popis svih dostupnih entiteta i sortirajte ih prema predviđenom stanju
  • spremi (…) - save an Iterativ entiteta. Ovdje možemo proslijediti više objekata kako bismo ih spremili u paketu
  • ispiranje () - fbujne sve zadatke na čekanju do baze podataka
  • saveAndFlush (…) - spremite entitet i odmah isperite promjene
  • deleteInBatch (…) - izbrišite Iterativ entiteta. Ovdje možemo proslijediti više objekata kako bismo ih izbrisali u paketu

Jasno je da se gornje sučelje proteže PagingAndSortingRepository što znači da ima sve metode prisutne u CrudRepository također.

6. Loše strane spremišta podataka Spring

Pored svih vrlo korisnih prednosti ovih spremišta, postoje i neke osnovne nedostatke izravne ovisnosti o njima:

  1. svoj kod povezujemo s knjižnicom i njezinim specifičnim apstrakcijama, kao što su `Page` ili` Pageable`; to naravno nije jedinstveno za ovu knjižnicu - ali moramo paziti da ne izložimo ove interne detalje implementacije
  2. proširenjem na pr. CrudRepository, odjednom izlažemo čitav niz metoda ustrajnosti. To je vjerojatno u redu i u većini okolnosti, ali mogli bismo naići na situacije u kojima bismo željeli steći precizniju kontrolu nad izloženim metodama, npr. stvoriti a ReadOnlyRepository to ne uključuje uštedjeti(…) i izbrisati(…) metode CrudRepository

7. Zaključak

Ovaj je članak obuhvatio neke kratke, ali važne razlike i značajke sučelja spremišta Spring Data JPA.

Za više informacija pogledajte seriju o Proljetnoj postojanosti.