Repository-Muster - Wie kann man es verstehen und wie funktioniert es mit „komplexen“ Entitäten?
Es fällt mir schwer, das Repository-Muster zu verstehen.
Es gibt viele Meinungen zu diesem Thema wie inRepository-Muster richtig gemacht aber auch andere Sachen wieRepository ist der neue Singleton oder wieder wie in Verwenden Sie kein DAO. Use Repository oder nimm einfachSpring JPA Data + Hibernate + MySQL + MAVEN wobei ein Repository anscheinend mit einem DAO-Objekt identisch ist.
Ich werde es leid, dieses Zeug zu lesen, da es so schwer sein kann, wie es in vielen Artikeln gezeigt wird.
Ich sehe es so: Es sieht so aus, als ob ich etwas in der Art möchte:
------------------------------------------------------------------------
| Server |
------------------------------------------------------------------------
| | | |
Client <-|-> Service Layer <-|-> Repository Layer <-|-> ORM / Database Layer |
| | | |
------------------------------------------------------------------------
DasService Layer
takes*DTO
Objekte und übergibt diese an dasRepository Layer
das ist im Grunde nichts anderes als "der Typ", der weiß,Wi Eine Entität kann gespeichert werden.
Nehmen Sie zum Beispiel an, Sie haben eine Zusammenstellung einiger Werkzeuge bitte beachten Sie, dass dies nur Pseudo-Code ist)
@Entity
class ToolSet {
@Id
public Long id;
@OneToOne
public Tool tool1;
@OneToOne
public Tool tool2;
}
@Entity
class Tool {
@Id
public Long id;
@OneToMany
public ToolDescription toolDescription;
}
@Entity
class ToolDescription {
@Id
public Long id;
@NotNull
@OneToOne
public Language language
public String name;
public String details;
}
Das, was ich nicht bekomme, ist der Teil, wo ich ein @ bekomToolSetDTO
Objekt vom Client.
Wie ich es bisher verstanden habe, konnte ich ein @ schreibToolSetRepository
mit einer MethodeToolSetRepository.save(ToolSetDTO toolSetDto)
Das " weiß, wie man @ speiche" einToolSetDTO
. Aber fast jedes Tutorial besteht das @ nic*DTO
aber dieEntity
stattdessen
Was mich hier stört ist das wenn du mein @ nimmToolSet
Beispiel von oben Ich müsste die folgenden Schritte ausführen:
toolSetDto
und überprüfe ob nichtnull
Für jedestool*Dto
gehörttoolSetDto
a) Wenn eine gültige ID hat, konvertiere von
DTO
zuEntity
andernfalls neuen Datenbankeintrag erstellenb)
toolDescriptionDto
und konvertiere / speichere es in die Datenbank oder erstelle einen neuen EintragNach Überprüfung der oben genannten InstanzenToolSet
(Entität) und richten Sie es so ein, dass es in der Datenbank verbleibt.All dies ist zu komplex, um es einfach der Servicefunktion (Schnittstelle für den Client) zu überlassen, dies zu tun.
Was ich darüber nachdachte, war das Erstellen von z. einToolSetRepository
aber die Frage hier ist
ToolSet
entity Objekt oder verwendet es einDTO
Objekt Auf jeden Fall: Ist das*Repository
erlaubt zuverwende andere Repository-Objekte? Wie wenn ich @ speichern wiToolSet
aber ich muss @ speicheTool
undToolDescription
first - würde ich @ verwendToolRepository
undToolDescriptionRepository
InnerhalbToolSetRepository
?Wenn ja: Warum wird das Repository-Muster nicht beschädigt? Wenn dieses Muster im Grunde genommen eine Schicht zwischen dem Dienst und meinem ORM-Framework ist, fühlt es sich einfach nicht "richtig" an, Abhängigkeiten zu anderen @ hinzuzufüge
*Repository
Klassen aus Abhängigkeitsgründen.Ich weiß nicht, warum ich das nicht verstehen kann. Es klingt nichtDa kompliziert, aber es gibt immer noch Hilfe da draußen wieSpring Data
. Eine andere Sache, die mich stört, da ich wirklich nicht sehe, wie das machtetwa einfacher. Vor allem, weil ich Hibernate bereits verwende - ich sehe den Vorteil nicht (aber vielleicht ist das eine andere Frage).
So .. Ich weiß, das ist eine lange Frage, aber ich habe bereits ein paar Tage lang nachgeforscht. Es gibt bereits Code, an dem ich gerade arbeite und der zu einem Durcheinander wird, weil ich dieses Muster einfach nicht durchschauen kann.
Ich hoffe, jemand kann mir ein größeres Bild als die meisten Artikel und Tutorials geben, die nicht über die Implementierung eines sehr, sehr einfachen Beispiels für ein Repository-Muster hinausgehen.