M
maki
Gast
Hallo zusammen,
habe aus Interesse ein paar Fragen an euch bez. JPA bzw. EclipseLink/Hibernate/anderer ORMs:
- Wie lasst ihr die IDs eurer Entitäten erzeugen?
- Wie implementiert ihr die equals und hashCode Methoden eurer Entitäten?
Bin gerade an einem Projekt(u.a. zu Übungszwecken), bei dem ich versuche mich an DDD zu halten, also "Domain Driven Design".
In Eric Evans Buch dazu werden ja die Bausteine dazu erklärt, Entites, ValueObjects, Repositories, Factories, etc. pp.
U.a. erklärt Evans, dass Entities Ids brauchen und nur danach verglichen werden sollten/dürfen, schon bei der Erzeugung bekommen Entities Ids, komplexe Objekte wie Entities werden in Factories erzeugt, diese müssen wissen wie man Ids vergibt.
Habe bis jetzt nur Vorteile darin gesehen (abgesehen davon wie man der Factory beibringt, welche Ids sie vergeben kann), Entitäten, die nur anhand ihrer Id identifiziert werden, nutzen die Id für equals und hashCode, die Id ändert sich nie(egal ob vor oder nach dem persistieren), dadurch kann man problemlos auch transiente (also nicht persistierte) Entitäten miteinander vergleichen, sie in HashSet verwenden, TreeSets, etc. pp.
Probleme die dabei vermieden werden:
- equals & hashCode können wirklich "sauber" imlpementiert werden, ohne Kompromisse, keine bösen Überraschungen mit HashSet, TreeSets oder sonstigen Collections.
- wie die Datenbank bzw. das ORM Ids verteilt (Sequence, Identity, etc. pp.) ist vollkommen egal, weil die Db schlicht keine Ids mehr selber vergibt, man ist unabhängig
Probleme die man bekommt:
- Man muss selber einen Weg suchen, welche Ids vergeben werden können, UUIDs sind eine recht einfache Möglichkeit, sind im Bezug auf Performance aber nicht trivial, eine Oracle Db zB. kann man dazu bringen, Sequenzen zu reservieren und dann diese zu verwenden, im Moment mache ich das so: Beim initialisieren der Factory wird ein Id Generator injiziert (Ids sind Integers), der wird mit der höchsten bereits vorhandenen Id der Tabelle initialisiert und zählt von da an nur nach oben.
- Es kann schwieriger werden, daten "hintenrum" per SQL Script in die Db zu schiessen während die App noch läuft, aber das ist ja kein neues Problem bei ORMs.
Wollte mal eure Meinung dazu hören und was eure Best practices sind
habe aus Interesse ein paar Fragen an euch bez. JPA bzw. EclipseLink/Hibernate/anderer ORMs:
- Wie lasst ihr die IDs eurer Entitäten erzeugen?
- Wie implementiert ihr die equals und hashCode Methoden eurer Entitäten?
Bin gerade an einem Projekt(u.a. zu Übungszwecken), bei dem ich versuche mich an DDD zu halten, also "Domain Driven Design".
In Eric Evans Buch dazu werden ja die Bausteine dazu erklärt, Entites, ValueObjects, Repositories, Factories, etc. pp.
U.a. erklärt Evans, dass Entities Ids brauchen und nur danach verglichen werden sollten/dürfen, schon bei der Erzeugung bekommen Entities Ids, komplexe Objekte wie Entities werden in Factories erzeugt, diese müssen wissen wie man Ids vergibt.
Habe bis jetzt nur Vorteile darin gesehen (abgesehen davon wie man der Factory beibringt, welche Ids sie vergeben kann), Entitäten, die nur anhand ihrer Id identifiziert werden, nutzen die Id für equals und hashCode, die Id ändert sich nie(egal ob vor oder nach dem persistieren), dadurch kann man problemlos auch transiente (also nicht persistierte) Entitäten miteinander vergleichen, sie in HashSet verwenden, TreeSets, etc. pp.
Probleme die dabei vermieden werden:
- equals & hashCode können wirklich "sauber" imlpementiert werden, ohne Kompromisse, keine bösen Überraschungen mit HashSet, TreeSets oder sonstigen Collections.
- wie die Datenbank bzw. das ORM Ids verteilt (Sequence, Identity, etc. pp.) ist vollkommen egal, weil die Db schlicht keine Ids mehr selber vergibt, man ist unabhängig
Probleme die man bekommt:
- Man muss selber einen Weg suchen, welche Ids vergeben werden können, UUIDs sind eine recht einfache Möglichkeit, sind im Bezug auf Performance aber nicht trivial, eine Oracle Db zB. kann man dazu bringen, Sequenzen zu reservieren und dann diese zu verwenden, im Moment mache ich das so: Beim initialisieren der Factory wird ein Id Generator injiziert (Ids sind Integers), der wird mit der höchsten bereits vorhandenen Id der Tabelle initialisiert und zählt von da an nur nach oben.
- Es kann schwieriger werden, daten "hintenrum" per SQL Script in die Db zu schiessen während die App noch läuft, aber das ist ja kein neues Problem bei ORMs.
Wollte mal eure Meinung dazu hören und was eure Best practices sind