Es fällt mir schwer, das Repository-Muster zu verstehen.
Es gibt viele Meinungen zu diesem Thema, wie in Repository-Muster richtig gemacht, aber auch andere Dinge wie Repository ist das neue Singleton oder wieder wie in DAO nicht verwenden Repository verwenden oder einfach Spring JPA Data + Hibernate + MySQL + MAVEN nehmen, wo irgendwie Ein Repository scheint mit einem DAO-Objekt identisch zu sein.
Ich werde es leid, dieses Zeug zu lesen, da dies imho nicht so schwer sein kann, wie es in vielen Artikeln gezeigt wird.
Ich sehe es so: Es scheint, dass ich so etwas will:
------------------------------------------------------------------------
| Server |
------------------------------------------------------------------------
| | | |
Client <-|-> Service Layer <-|-> Repository Layer <-|-> ORM / Database Layer |
| | | |
------------------------------------------------------------------------
Das Service Layernimmt *DTOObjekte und gibt diese an den weiter Repository Layer, der im Grunde nichts anderes als "der Typ" ist, der weiß, wie eine Entität gespeichert werden kann.
Angenommen, Sie haben eine Zusammensetzung einiger Tools ( bitte beachten Sie, dass dies nur Pseudocode 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, in dem ich ein ToolSetDTOObjekt vom Client bekomme .
So wie ich es bisher verstanden habe, konnte ich eine ToolSetRepositorymit einer Methode schreiben ToolSetRepository.save(ToolSetDTO toolSetDto), die " weiß, wie man speichert " ToolSetDTO. Aber fast jedes Tutorial besteht nicht das, *DTOsondern das Entity.
Was mich hier stört, ist, dass ToolSetich die folgenden Schritte ausführen muss , wenn Sie mein Beispiel von oben nehmen :
- Nehmen Sie
toolSetDtound überprüfen Sie, wenn nichtnull - Für jedes
tool*DtoEigentum vontoolSetDto
a) Wenn es eine gültige ID hat, konvertieren Sie von,DTOumEntityandernfalls einen neuen Datenbankeintrag zu erstellen.
B)toolDescriptionDtound konvertieren / speichern Sie es in die Datenbank oder erstellen Sie einen neuen Eintrag - Nachdem Sie die oben genannten Instanzen
ToolSet(Entitäten) überprüft und eingerichtet haben, um sie in der Datenbank zu speichern
All dies ist zu komplex, um die Servicefunktion (Schnittstelle für den Client) einfach damit umgehen zu lassen.
Ich habe darüber nachgedacht, zB ein zu erschaffen, ToolSetRepositoryaber die Frage hier ist
- Nimmt es ein
ToolSetEntitätsobjekt oder verwendet es einDTOObjekt? - Auf jeden Fall: Ist der
*Repositoryzu dürfen verwenden andere Objekte Repository? Zum Beispiel,ToolSetwenn ich speichern möchte, aber speichern mussToolundToolDescriptionzuerst - würde ich verwendenToolRepositoryundToolDescriptionRepositorydrinnenToolSetRepository?
Wenn ja: Warum wird das Repository-Muster nicht beschädigt? Wenn dieses Muster im Grunde eine Schicht zwischen dem Dienst und meinem ORM-Framework ist, fühlt es sich aus Abhängigkeitsgründen einfach nicht "richtig" an, Abhängigkeiten zu anderen*RepositoryKlassen hinzuzufügen .
Ich weiß nicht, warum ich das nicht verstehen kann. Es klingt nicht so kompliziert, aber es gibt immer noch Hilfe wie Spring Data. Eine andere Sache, die mich stört, da ich wirklich nicht sehe, wie das etwas einfacher macht . Zumal ich Hibernate bereits verwende - ich sehe den Vorteil nicht (aber vielleicht ist das eine andere Frage).
Also ... ich weiß, dass dies eine lange Frage ist, aber ich habe bereits ein paar Tage lang darüber geforscht. Es gibt bereits Code, an dem ich gerade arbeite, der zu einem Chaos wird, weil ich dieses Muster einfach nicht durchschauen kann.
Ich hoffe, jemand kann mir ein größeres Bild geben als die meisten Artikel und Tutorials, die nicht über die Implementierung eines sehr, sehr einfachen Beispiels eines Repository-Musters hinausgehen.