Verwirrt über Spring-Data-DDD repository pattern
Ich weiß nicht so viel über DDD-repository-Muster, aber die Umsetzung im Frühjahr ist die Verwirrung mich.
public interface PersonRepository extends JpaRepository<Person, Long> { … }
Als Schnittstelle erweitert JpaRepository (oder MongoDBRepository...), wenn Sie wechseln von einer db zur anderen, ändern Sie die Schnittstelle als gut.
Ist für mich eine Schnittstelle ist da, um gewisse Abstraktion, aber hier ist es nicht so sehr Abstrakt...
Wissen Sie, warum der Frühling-Daten funktioniert?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Du hast Recht, ein Interface ist eine Abstraktion, über etwas, das funktioniert gleich für alle implementierende Klassen, die aus einer externen Sicht.
Und das ist genau das, was hier passiert:
Aber JpaRepository und MongoDBRepository nichts gemein haben, außer die Sachen, die definiert wird, in der es gemeinsame super-Schnittstellen:
Also für mich sieht das normal aus.
Wenn Sie die Klassen, die die Implementierung Ihrer Repository-verwenden Sie dann PagingAndSortingRepository-oder Repository-wenn Sie wollen in der Lage sein, wechseln Sie von der JPA-Implementierung, um eine Dokument-basierte Implementierung (sorry, aber ich kann mir nicht vorstellen, wie ein use - case- sowieso). Und natürlich Ihre Repository-Implementierung implementieren sollte die richtige Schnittstelle (JpaRepository, MongoDBRepository) je nachdem, was es ist.
Die Argumentation hinter diesem ist ziemlich klar in dieser blog-Beitrag http://blog.springsource.com/2011/02/10/getting-started-with-spring-data-jpa/.
Wenn Sie nicht Vertrauen Quellen, so nah an der Quelle (Wortspiel beabsichtigt), es wäre eine gute Idee, diesen Beitrag zu Lesen als auch http://www.brucephillips.name/blog/index.cfm/2011/3/25/Using-Spring-Data-JPA-To-Reduced-Data-Access-Coding.
M2 bis Frühjahr Daten, die wir benötigten Benutzer zu erweitern
JpaRepository
aufgrund der folgenden Gründe:Repository
,CrudRepository
oder wie outweights die Mühe, die Sie haben, um in der eben beschriebenen Ecke Fall. Sie könnenexclude
undinclude
Elemente in den Namensraum zu gewinnen, feiner abgestufte Kontrolle über diese.@Transactional
. Diese Entscheidung wiederum wurde getrieben durch den AlgorithmusAnnotationTransactionAttributeSource
nutzt, finden Sie die Transaktion Konfiguration. So, wie wir wollten, um dem Nutzer die Möglichkeit zu konfigurieren-Transaktionen, indem Sie nur redeclaring eine CRUD-Methode in der konkreten repository-Schnittstelle und der Anwendung@Transactional
auf Sie. Für die RC1 entschieden wir uns zur Implementierung eines benutzerdefiniertenTransactionAttributeSource
bewegen zu können und die Anmerkungen, die zurück in das repository CRUD-Umsetzung.Lange Rede, kurzer Sinn, hier ist, was es läuft darauf hinaus:
Als der RC1, es gibt keine Notwendigkeit, Sie zu erweitern speichern spezifischen repository-Schnittstelle mehr, außer Sie wollen...
List
-basierten Zugriff auffindAll(…)
statt derIterable
-basierte, in der mehr core-repository-Schnittstellen (obwohl Sie könnte einfach redeclare die relevanten Methoden in einem gemeinsamen Basis-Schnittstelle zur Rückgabe vonList
s)saveAndFlush(…)
und so weiter.In der Regel sind Sie viel flexibler hinsichtlich der Exposition von CRUD-Methoden seit RC1, da können Sie auch erweitern nur das
Repository
marker-interface und fügen Sie selektiv die CRUD-Methoden, die Sie verfügbar machen möchten. Als backing-Durchführung weiterhin implementieren alle Methoden desPagingAndSortingRepository
können wir noch die route die Aufrufe der Instanz:In diesem Beispiel definieren wir
MyBaseRepository
nur aussetzenfindAll()
undfindOne(…)
(wird weitergeleitet in die Instanz der Implementierung der CRUD-Methoden) und die Beton-repository hinzufügen einer finder-Methode, um die beiden CRUD lieben.Weitere details zu diesem Thema konsultieren Sie bitte die die Referenz-Dokumentation.