CrudRepository, JpaRepository und PagingAndSortingRepository in Spring Data

1. Übersicht

In diesem kurzen Artikel konzentrieren wir uns auf verschiedene Arten von Spring Data-Repository-Schnittstellen und deren Funktionalität. Wir werden ansprechen:

  • CrudRepository
  • PagingAndSortingRepository
  • JpaRepository

Einfach ausgedrückt, jedes Repository in Spring Data erweitert die generische Repository- Oberfläche, aber darüber hinaus verfügen sie jeweils über unterschiedliche Funktionen.

2. Spring Data Repositories

Beginnen wir mit dem JpaRepository, das PagingAndSortingRepository und damit auch das CrudRepository erweitert .

Jedes davon definiert seine eigene Funktionalität:

  • CrudRepository bietet CRUD-Funktionen
  • PagingAndSortingRepository bietet Methoden zum Paginieren und Sortieren von Datensätzen
  • JpaRepository bietet JPA-bezogene Methoden wie das Löschen des Persistenzkontexts und das Löschen von Datensätzen in einem Stapel

Aufgrund dieser Vererbungsbeziehung enthält das JpaRepository die vollständige API von CrudRepository und PagingAndSortingRepository .

Wenn wir nicht die volle Funktionalität von JpaRepository und PagingAndSortingRepository benötigen , können wir einfach das CrudRepository verwenden .

Schauen wir uns nun ein kurzes Beispiel an, um diese APIs besser zu verstehen.

Wir beginnen mit einer einfachen Produktentität :

@Entity public class Product { @Id private long id; private String name; // getters and setters }

Und lassen Sie uns eine einfache Operation implementieren - finden Sie ein Produkt anhand seines Namens:

@Repository public interface ProductRepository extends JpaRepository { Product findByName(String productName); }

Das ist alles. Das Spring Data Repository generiert die Implementierung automatisch anhand des von uns angegebenen Namens.

Dies war natürlich ein sehr einfaches Beispiel; Hier können Sie tiefer in Spring Data JPA einsteigen.

3. CrudRepository

Schauen wir uns nun den Code für die CrudRepository- Oberfläche an:

public interface CrudRepository extends Repository {  S save(S entity); T findOne(ID primaryKey); Iterable findAll(); Long count(); void delete(T entity); boolean exists(ID primaryKey); }

Beachten Sie die typische CRUD-Funktionalität:

  • save (…) - hat eine Iterable von Entitäten. Hier können wir mehrere Objekte übergeben, um sie in einem Stapel zu speichern
  • findOne (…) - Ruft eine einzelne Entität basierend auf dem übergebenen Primärschlüsselwert ab
  • findAll () - Ermittelt eine Iterable aller verfügbaren Entitäten in der Datenbank
  • count () - Gibt die Anzahl der gesamten Entitäten in einer Tabelle zurück
  • delete (…) - Löscht eine Entität basierend auf dem übergebenen Objekt
  • existiert (…) - Überprüfen Sie anhand des übergebenen Primärschlüsselwerts, ob eine Entität existiert

Diese Oberfläche sieht recht allgemein und einfach aus, bietet jedoch alle grundlegenden Abfrageabstraktionen, die in einer Anwendung benötigt werden.

4. PagingAndSortingRepository

Schauen wir uns nun eine andere Repository-Schnittstelle an, die CrudRepository erweitert :

public interface PagingAndSortingRepository extends CrudRepository { Iterable findAll(Sort sort); Page findAll(Pageable pageable); }

Diese Schnittstelle bietet eine Methode findAll (Pageable pageable) , die der Schlüssel zur Implementierung von Pagination ist.

Bei Verwendung von Pageable erstellen wir ein Pageable- Objekt mit bestimmten Eigenschaften und müssen mindestens Folgendes angeben:

  1. Seitengröße
  2. Aktuelle Seitenzahl
  3. Sortierung

Nehmen wir also an, wir möchten die erste Seite einer Ergebnismenge anzeigen, sortiert nach Nachname, aufsteigend, mit jeweils nicht mehr als fünf Datensätzen. So können wir dies mit einer PageRequest- und einer Sort- Definition erreichen:

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

Wenn Sie das pageable Objekt an die Spring-Datenabfrage übergeben, werden die fraglichen Ergebnisse zurückgegeben (der erste Parameter von PageRequest basiert auf Null).

5. JpaRepository

Zum Schluss schauen wir uns die JpaRepository- Oberfläche an:

public interface JpaRepository extends PagingAndSortingRepository { List findAll(); List findAll(Sort sort); List save(Iterable entities); void flush(); T saveAndFlush(T entity); void deleteInBatch(Iterable entities); }

Schauen wir uns noch einmal jede dieser Methoden kurz an:

  • findAll () - Ruft eine Liste aller verfügbaren Entitäten in der Datenbank ab
  • findAll (…) - Ruft eine Liste aller verfügbaren Entitäten ab und sortiert sie unter der angegebenen Bedingung
  • save (…) - hat eine Iterable von Entitäten. Hier können wir mehrere Objekte übergeben, um sie in einem Stapel zu speichern
  • flush () - f alle ausstehenden Aufgaben in die Datenbank übertragen
  • saveAndFlush (…) - speichert die Entität und löscht Änderungen sofort
  • deleteInBatch (…) - Löscht eine Iterable von Entitäten. Hier können wir mehrere Objekte übergeben, um sie in einem Stapel zu löschen

Die obige Schnittstelle erweitert eindeutig PagingAndSortingRepository, was bedeutet, dass alle Methoden auch im CrudRepository vorhanden sind .

6. Nachteile von Spring Data Repositories

Beyond all the very useful advantages of these repositories, there are some basic downsides of directly depending on these as well:

  1. we couple our code to the library and to its specific abstractions, such as `Page` or `Pageable`; that's of course not unique to this library – but we do have to be careful not to expose these internal implementation details
  2. by extending e.g. CrudRepository, we expose a complete set of persistence method at once. This is probably fine in most circumstances as well but we might run into situations where we'd like to gain more fine-grained control over the methods exposed, e.g. to create a ReadOnlyRepository that doesn't include the save(…) and delete(…) methods of CrudRepository

7. Conclusion

Dieser Artikel behandelte einige kurze, aber wichtige Unterschiede und Funktionen der Spring Data JPA-Repository-Schnittstellen.

Weitere Informationen finden Sie in der Reihe zu Spring Persistence.