CrudRepository, JpaRepository en PagingAndSortingRepository in Spring Data

1. Overzicht

In dit korte artikel zullen we ons concentreren op verschillende soorten Spring Data-repository-interfaces en hun functionaliteit. We zullen het hebben over:

  • CrudRepository
  • PagingAndSortingRepository
  • JpaRepository

Simpel gezegd, elke repository in Spring Data breidt de generieke versie uit Opslagplaats interface, maar verder hebben ze elk een andere functionaliteit.

2. Spring Data Repositories

Laten we beginnen met de JpaRepository - die zich uitstrekt PagingAndSortingRepository en, op zijn beurt, de CrudRepository.

Elk van deze definieert zijn eigen functionaliteit:

  • CrudRepository biedt CRUD-functies
  • PagingAndSortingRepository biedt methoden om paginering uit te voeren en records te sorteren
  • JpaRepository biedt JPA-gerelateerde methoden zoals het leegmaken van de persistentiecontext en het verwijderen van records in een batch

En dus, vanwege deze overervingsrelatie, de JpaRepository bevat de volledige API van CrudRepository en PagingAndSortingRepository.

Als we niet de volledige functionaliteit nodig hebben die wordt geboden door JpaRepository en PagingAndSortingRepository, kunnen we gewoon de CrudRepository.

Laten we nu een snel voorbeeld bekijken om deze API's beter te begrijpen.

We beginnen met een simpele Product entiteit:

@Entity public class Product {@Id privé lange id; private String naam; // getters en setters}

En laten we een eenvoudige bewerking implementeren - zoek een Product op basis van zijn naam:

@Repository openbare interface ProductRepository breidt JpaRepository {Product findByName (String productName) uit; }

Dat is alles. De Spring Data Repository zal de implementatie automatisch genereren op basis van de naam die we hebben opgegeven.

Dit was natuurlijk een heel eenvoudig voorbeeld; u kunt hier dieper ingaan op Spring Data JPA.

3. CrudRepository

Laten we nu eens kijken naar de code voor de CrudRepository koppel:

openbare interface CrudRepository breidt Repository {S save (S-entiteit) uit; T findOne (ID primaire sleutel); Herhaalbare findAll (); Lange telling (); ongeldig verwijderen (T-entiteit); boolean bestaat (ID primaryKey); }

Let op de typische CRUD-functionaliteit:

  • opslaan (…) - seen Herhaalbaar van entiteiten. Hier kunnen we meerdere objecten doorgeven om ze in een batch op te slaan
  • vind een(…) - verkrijg een enkele entiteit op basis van doorgegeven primaire sleutelwaarde
  • vind alle() - haal een Herhaalbaar van alle beschikbare entiteiten in de database
  • count () - return het totaal aantal entiteiten in een tabel
  • verwijderen (...) - verwijder een entiteit op basis van het doorgegeven object
  • bestaat (…) - controleer of een entiteit bestaat op basis van de doorgegeven primaire sleutelwaarde

Deze interface ziet er vrij algemeen en eenvoudig uit, maar biedt eigenlijk alle elementaire query-abstracties die nodig zijn in een applicatie.

4. PagingAndSortingRepository

Laten we nu eens kijken naar een andere repository-interface, die zich uitbreidt CrudRepository:

openbare interface PagingAndSortingRepository breidt CrudRepository {Iterable findAll (Sort sort) uit; Page findAll (pageable pageable); }

Deze interface biedt een methode findAll (pageable pageable), wat de sleutel is tot implementatie Paginering.

Tijdens gebruik Pageable, creëren we een Pageable object met bepaalde eigenschappen en we moeten ten minste specificeren:

  1. Pagina grootte
  2. Huidig ​​paginanummer
  3. Sorteren

Laten we dus aannemen dat we de eerste pagina van een resultatenset gesorteerd op willen weergeven achternaam, oplopend, met elk niet meer dan vijf records. Dit is hoe we dit kunnen bereiken met een PageRequest en een Soort definitie:

Sort sort = new Sort (nieuwe Sort.Order (Direction.ASC, "lastName")); Pageable pageable = nieuwe PageRequest (0, 5, sorteren);

Als u het pageable object doorgeeft aan de Spring-gegevensquery, worden de resultaten in kwestie geretourneerd (de eerste parameter van PageRequest is op nul gebaseerd).

5. JpaRepository

Ten slotte bekijken we het JpaRepository koppel:

openbare interface JpaRepository breidt PagingAndSortingRepository {List findAll () uit; List findAll (Sorteren sorteren); List save (herhaalbare entiteiten); leegte doorspoelen (); T saveAndFlush (T-entiteit); void deleteInBatch (herhaalbare entiteiten); }

Laten we nogmaals naar elk van deze methoden kijken:

  • vind alle() - krijg een Lijst van alle beschikbare entiteiten in de database
  • vind alle(…) - krijg een Lijst van alle beschikbare entiteiten en sorteer ze volgens de opgegeven voorwaarde
  • opslaan (…) - seen Herhaalbaar van entiteiten. Hier kunnen we meerdere objecten doorgeven om ze in een batch op te slaan
  • flush () - flush alle in behandeling zijnde taken naar de database
  • saveAndFlush (…) - sla de entiteit op en spoel wijzigingen onmiddellijk door
  • deleteInBatch (…) - verwijder een Herhaalbaar van entiteiten. Hier kunnen we meerdere objecten doorgeven om ze in een batch te verwijderen

Het is duidelijk dat bovenstaande interface zich uitstrekt PagingAndSortingRepository wat betekent dat alle methoden aanwezig zijn in de CrudRepository ook.

6. Nadelen van Spring Data Repositories

Naast alle zeer nuttige voordelen van deze repositories, zijn er ook enkele fundamentele nadelen van direct afhankelijk zijn van deze:

  1. we koppelen onze code aan de bibliotheek en aan zijn specifieke abstracties, zoals `Page` of` Pageable`; dat is natuurlijk niet uniek voor deze bibliotheek - maar we moeten oppassen dat we deze interne implementatiedetails niet onthullen
  2. door b.v. CrudRepository, stellen we een complete set persistentiemethoden tegelijk bloot. Dit is waarschijnlijk ook prima in de meeste omstandigheden, maar we kunnen situaties tegenkomen waarin we meer controle willen krijgen over de blootgestelde methoden, bijv. om een ReadOnlyRepository dat is exclusief de sparen(…) en verwijderen (...) methodes van CrudRepository

7. Conclusie

Dit artikel behandelde enkele korte maar belangrijke verschillen en kenmerken van Spring Data JPA-repository-interfaces.

Bekijk voor meer informatie de serie over Spring Persistence.