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:
- Veličina stranice
- Broj trenutne stranice
- 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:
- 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
- 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.