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 Layer
nimmt *DTO
Objekte 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 ToolSetDTO
Objekt vom Client bekomme .
So wie ich es bisher verstanden habe, konnte ich eine ToolSetRepository
mit einer Methode schreiben ToolSetRepository.save(ToolSetDTO toolSetDto)
, die " weiß, wie man speichert " ToolSetDTO
. Aber fast jedes Tutorial besteht nicht das, *DTO
sondern das Entity
.
Was mich hier stört, ist, dass ToolSet
ich die folgenden Schritte ausführen muss , wenn Sie mein Beispiel von oben nehmen :
- Nehmen Sie
toolSetDto
und überprüfen Sie, wenn nichtnull
- Für jedes
tool*Dto
Eigentum vontoolSetDto
a) Wenn es eine gültige ID hat, konvertieren Sie von,DTO
umEntity
andernfalls einen neuen Datenbankeintrag zu erstellen.
B)toolDescriptionDto
und 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, ToolSetRepository
aber die Frage hier ist
- Nimmt es ein
ToolSet
Entitätsobjekt oder verwendet es einDTO
Objekt? - Auf jeden Fall: Ist der
*Repository
zu dürfen verwenden andere Objekte Repository? Zum Beispiel,ToolSet
wenn ich speichern möchte, aber speichern mussTool
undToolDescription
zuerst - würde ich verwendenToolRepository
undToolDescriptionRepository
drinnenToolSetRepository
?
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*Repository
Klassen 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.