CrudRepository, JpaRepository und PagingAndSortingRepository in Spring Data

CrudRepository, JpaRepository und PagingAndSortingRepository in Spring Data

1. Überblick

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

  • CrudRepository

  • PagingAndSortingRepository

  • JpaRepository

Einfach ausgedrückt, jedes Repository inSpring Data erweitert die generischeRepository-Schnittstelle, aber darüber hinaus verfügen sie jeweils über unterschiedliche Funktionen.

2. Spring Data Repositories

Let’s start with the JpaRepository - erweitertPagingAndSortingRepository und damitCrudRepository.

Jedes von diesen definiert seine eigene Funktionalität:

Aufgrund dieser Vererbungsbeziehung sindJpaRepository contains the full API of CrudRepository and PagingAndSortingRepository.

Wenn wir nicht die volle Funktionalität vonJpaRepository undPagingAndSortingRepository benötigen, können wir einfachCrudRepository verwenden.

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

Wir beginnen mit einer einfachenProduct-Entitä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 einProduct basierend auf seinem Namen:

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

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

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

3. CrudRepository

Schauen wir uns nun den Code für dieCrudRepository-Schnittstelle 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(…) – speichertIterable von Entitäten. Hier können wir mehrere Objekte übergeben, um sie in einem Stapel zu speichern

  • findOne(…) - Ermittelt eine einzelne Entität basierend auf dem übergebenen Primärschlüsselwert

  • findAll() - Ermittelt einIterable aller verfügbaren Entitäten in der Datenbank

  • count() – retzt die Anzahl der gesamten Entitäten in einer Tabelle

  • delete(…) - Löscht eine Entität basierend auf dem übergebenen Objekt

  • exists (…) - Überprüfen Sie anhand des übergebenen Primärschlüsselwerts, ob eine Entität vorhanden ist

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, dieCrudRepository erweitert:

public interface PagingAndSortingRepository
  extends CrudRepository {

    Iterable findAll(Sort sort);

    Page findAll(Pageable pageable);
}

Diese Schnittstelle bietet eine MethodefindAll(Pageable pageable), die der Schlüssel zur Implementierung vonPagination. ist

Bei Verwendung vonPageable erstellen wir einPageable-Objekt mit bestimmten Eigenschaften und müssen mindestens Folgendes angeben:

  1. Seitengröße

  2. Aktuelle Seitennummer

  3. Sortierung

Nehmen wir also an, wir möchten die erste Seite einer Ergebnismenge anzeigen, sortiert nachlastName, aufsteigend, mit jeweils nicht mehr als fünf Datensätzen. So können wir dies mit einer Definition vonPageRequest undSorterreichen:

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 vonPageRequest basiert auf Null).

5. JpaRepository

Zum Schluss werfen wir einen Blick auf dieJpaRepository-Schnittstelle:

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 kurz jede dieser Methoden an:

  • findAll() - ErmitteltList aller verfügbaren Entitäten in der Datenbank

  • findAll(…) - Ermittelt einList aller verfügbaren Entitäten und sortiert sie unter der angegebenen Bedingung

  • save(…) – speichertIterable von Entitäten. Hier können wir mehrere Objekte übergeben, um sie in einem Stapel zu speichern

  • flush() – flöscht alle ausstehenden Aufgaben in der Datenbank

  • saveAndFlush(…) - Speichern Sie die Entität und löschen Sie die Änderungen sofort

  • deleteInBatch (…) - Löscht einIterable von Entitäten. Hier können wir mehrere Objekte übergeben, um sie in einem Stapel zu löschen

Die obige Schnittstelle erweitert eindeutigPagingAndSortingRepository, was bedeutet, dass alle Methoden auch inCrudRepository vorhanden sind.

6. Nachteile von Spring Data Repositories

Neben all den nützlichen Vorteilen dieser Repositories gibt es auch einige grundlegende Nachteile, die davon abhängen:

  1. Wir koppeln unseren Code an die Bibliothek und an ihre spezifischen Abstraktionen, wie z. B.Page oderPageable. Das ist natürlich nicht nur in dieser Bibliothek der Fall - aber wir müssen darauf achten, diese internen Implementierungsdetails nicht preiszugeben

  2. indem z.B. CrudRepository stellen wir sofort einen vollständigen Satz von Persistenzmethoden zur Verfügung. Dies ist wahrscheinlich auch in den meisten Fällen in Ordnung, aber wir könnten in Situationen geraten, in denen wir eine genauere Kontrolle über die exponierten Methoden erlangen möchten, z. um einReadOnlyRepository zu erstellen, das die Methodensave(…) unddelete(…) vonCrudRepository nicht enthält

7. Fazit

In diesem Artikel wurden einige kurze, aber wichtige Unterschiede und Funktionen der JPA-Repository-Schnittstellen von Spring Data behandelt.

Weitere Informationen finden Sie in der Reihe zuSpring Persistence.