2016-04-15 14 views
0

Ich muss Domain-Objekt (DO) in DB speichern.Domain-Objekt zu persistierenden Einheit Konvertierung

Der einfachste Ansatz ist in DO Definition einiger JPA Annotationen wie @Entity, @SequenceGenerator, @Table usw. hinzufügen, aber ich will nicht mit einer anderen Konzeption DO mischte wie persistierenden. Also verwende ich ein separates DTO-Objekt und setze hier Anmerkungen.

Da ich ein großer Domain Driven Design Anhänger bin, verbinde ich nicht direkt mit DB und verwenden Repository Muster. Wenn ich in Zukunft von RDBMS zu z.B. NoSQL alle Änderungen werden nur im Repository durchgeführt und mein DO wird intakt sein.

So ist die Flusssequenz ist

DO -> Repository -converting-> DTO -> DB

Da meine DO viele Felder hat der Umwandlungsschritt recht umständlich ist und zugleich ganz trivial: bekomme fieldA von DO und lege es in fieldA 'in DTO (mit einfachen Transformationen in einigen Fällen). Momentan mache ich das manuell in einem separaten Transformer.

Was sind andere (bessere?) Ansätze, um diesen Umwandlungsschritt zu machen?

UPDATE

Good comparison von bean-Mapping-Frameworks Dozer vs Orika vs Manuelle Feldzuordnung Ansatz

+2

Scheint wie übertriebene Technik. – Everv0id

+0

@ Everv0id können Sie einen besseren Ansatz vorschlagen? –

+0

Es scheint, dass orm Mapper forfor sind, es sei denn, es gibt etwas in dir db, das das dto-Objekt garantiert. Aber dann wirst du kein 1-1-Mapping mehr haben (und du kannst es immer neu entwerfen, dann brauchst du das. YAGNI gilt auch hier) – Batavia

Antwort

2

Zunächst einmal, das ist eine ganz große Idee, um Ihre persistent Einheit von Ihrem Domain-Objekten zu trennen. Ich habe mich mit Setups beschäftigt, bei denen beide Ansätze miteinander vermischt wurden und die uns danach zu einem kompletten Durcheinander führen.

Der Ansatz, nach dem Sie suchen, heißt 'Bean-Mapping'. Es gibt viele solche Mapper, Dozer scheint am weitesten verbreitet zu sein, aber es ist reflexionsbasiert und daher ziemlich langsam. Orika bietet eine gute Balance zwischen Leistung und Erweiterbarkeit, führt aber auch zu einigen seltsamen Problemen beim Laden von Klassen in der Java EE-Umgebung.

Die meisten Bean-Mapper führen eine automatische Zuordnung für gleich benannte Felder durch, zusätzliche Konvertierungen können für "einfache Transformationen" definiert werden, die Sie oben erwähnt haben. Hier ist das Beispiel von Orika Konfiguration für bestimmte Web-to-DB Entitätszuordnung (mit Abhilfe für die Classloading Ausgabe oben angewandt erwähnt): https://bitbucket.org/__jtalk/jacra/src/default/JAcraEJB/src/main/java/me/jtalk/jacra/utils/mapper/MappersRegistration.java

Sie können dann diese Mapper wie verwenden:

@Inject 
@UserMapper 
private BoundMapperFacade<UserEntity, UserWeb> userMapper; 
... 
UserEntity entity = userMapper.mapReverse(userWeb); 
mapper.map(entity); 
1

Statt Anmerkungen Wenn Sie zukünftig wirklich zu NoSQL wechseln möchten, können Sie yaml, xml mapping verwenden.

DO -> Repository -converting-> DTO -> DB
Was Sie hier versuchen, ist einfach kopieren Sie die Funktion von ORM. Es wird viel mehr Zeit brauchen, schafft wahrscheinlich neue Bugs und ist es überhaupt nicht wert.

Sie können erfolgreich ORM für enites verwenden. Sie werden Sie nicht mit dem Framework verbinden lassen, weil Framework auf einer höheren Abstraktionsebene operieren wird.
Repository ist ein interface, so können Sie NoSqlRepository in der Zukunft erstellen und Ihre Anwendung wird einfach gut funktionieren. (Zählt nicht die Datenmigration)

+0

Nosql ist keine Lösung für alles. Verwenden Sie vorsichtig – Batavia

+1

Sehen Sie sich das Thema des Autors an, er sprach über Nosql. Ich habe nicht über "für alles fix" gesprochen. – Dariss