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*DTOObjekte 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:

NehmentoolSetDto und überprüfe ob nichtnullFür jedestool*Dto gehörttoolSetDto
a) Wenn eine gültige ID hat, konvertiere vonDTO zuEntity andernfalls neuen Datenbankeintrag erstellen
b)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

Nimmt es einToolSet 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.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage