Kens Antwort ist im Grunde richtig, aber ich würde gerne sagen: "Warum sollten Sie eine über die andere verwenden?" Teil Ihrer Frage.
Grundlagen
Die Basisschnittstelle, die Sie für Ihr Repository auswählen, dient zwei Hauptzwecken. Zunächst erlauben Sie der Spring Data-Repository-Infrastruktur, Ihre Schnittstelle zu finden und die Proxy-Erstellung auszulösen, sodass Sie Instanzen der Schnittstelle in Clients einfügen. Der zweite Zweck besteht darin, so viele Funktionen wie nötig in die Schnittstelle zu integrieren, ohne zusätzliche Methoden deklarieren zu müssen.
Die gemeinsamen Schnittstellen
Die Spring Data-Kernbibliothek wird mit zwei Basisschnittstellen geliefert, die eine Reihe dedizierter Funktionen bereitstellen:
CrudRepository
- CRUD-Methoden
PagingAndSortingRepository
- Methoden zur Paginierung und Sortierung (erweitert CrudRepository
)
Geschäftsspezifische Schnittstellen
Die einzelnen Geschäftsmodule (z. B. für JPA oder MongoDB) stellen geschäftsspezifische Erweiterungen dieser Basisschnittstellen bereit, um den Zugriff auf geschäftsspezifische Funktionen wie Flushing oder dedizierte Stapelverarbeitung zu ermöglichen, die einige Geschäftsspezifikationen berücksichtigen. Ein Beispiel dafür ist , deleteInBatch(…)
von JpaRepository
denen verschieden ist , delete(…)
da es eine Abfrage verwendet die gegebenen Einheiten zu löschen , die leistungsfähiger ist , sondern kommt mit der Nebenwirkung der nicht die JPA-definierten Kaskaden Triggern (wie die Spezifikation definiert es).
Wir empfehlen im Allgemeinen , diese Basisschnittstellen nicht zu verwenden, da sie den Clients die zugrunde liegende Persistenztechnologie zugänglich machen und somit die Kopplung zwischen ihnen und dem Repository enger machen. Außerdem entfernen Sie sich ein wenig von der ursprünglichen Definition eines Repositorys, bei dem es sich im Grunde um eine "Sammlung von Entitäten" handelt. Also, wenn du kannst, bleib bei PagingAndSortingRepository
.
Benutzerdefinierte Repository-Basisschnittstellen
Der Nachteil von direkt abhängig von einer der bereitgestellten Basisschnittstellen ist zweifach. Beide mögen als theoretisch angesehen werden, aber ich denke, es ist wichtig, sich dessen bewusst zu sein:
- Abhängig von einer Spring Data-Repository-Schnittstelle wird Ihre Repository-Schnittstelle mit der Bibliothek gekoppelt. Ich denke nicht, dass dies ein besonderes Problem ist, da Sie wahrscheinlich sowieso Abstraktionen wie
Page
oder Pageable
in Ihrem Code verwenden werden. Spring Data unterscheidet sich nicht von anderen Universalbibliotheken wie Commons-Lang oder Guava. Solange es einen angemessenen Nutzen bietet, ist es in Ordnung.
- Wenn Sie z. B. erweitern
CrudRepository
, legen Sie sofort einen vollständigen Satz von Persistenzmethoden offen. Dies ist wahrscheinlich auch in den meisten Fällen in Ordnung, aber Sie könnten auf Situationen stoßen, in denen Sie eine genauere Kontrolle über die verfügbaren Methoden erlangen möchten, z. B. um eine zu erstellen ReadOnlyRepository
, die die save(…)
und delete(…)
Methoden von nicht enthält CrudRepository
.
Die Lösung für diese beiden Nachteile besteht darin, eine eigene Basis-Repository-Schnittstelle oder sogar eine Reihe davon zu erstellen. In vielen Anwendungen habe ich so etwas gesehen:
interface ApplicationRepository<T> extends PagingAndSortingRepository<T, Long> { }
interface ReadOnlyRepository<T> extends Repository<T, Long> {
// Al finder methods go here
}
Die erste Repository-Schnittstelle ist eine Allzweck-Basisschnittstelle, die eigentlich nur Punkt 1 behebt, aber auch den ID-Typ Long
aus Konsistenzgründen verknüpft. Die zweite Schnittstelle hat in der Regel alle find…(…)
kopierten Methoden CrudRepository
und PagingAndSortingRepository
aber nicht die Manipulation von der nicht aussetzen. Weitere Informationen zu diesem Ansatz finden Sie in der Referenzdokumentation .
Zusammenfassung - tl; dr
Mit der Repository-Abstraktion können Sie das Basis-Repository auswählen, das vollständig von Ihren architektonischen und funktionalen Anforderungen abhängt. Verwenden Sie die im Lieferumfang enthaltenen, falls zutreffend, und erstellen Sie bei Bedarf Ihre eigenen Repository-Basisschnittstellen. Halten Sie sich von den geschäftsspezifischen Repository-Schnittstellen fern, sofern dies nicht unvermeidbar ist.