Ich versuche, die beste Möglichkeit zu finden, JPA im Zusammenhang mit einem erholsamen Webdienst zu verwenden. Die Eingabe kommt als JSON und ich kann Jackson/JAX-RS verwenden, um das zu einem POJO zu konvertieren. Dies wird an einen Dienst übergeben, wo ich irgendwie in eine JPA-Entität zusammenführen muss.Wie Eingabe von einem Webdienst zu einer JPA-Entität zusammengeführt wird
Dies sind die Optionen, die ich bisher mit Vor- und Nachteilen gefunden habe.
1. JPA merge()
Das erste, was ich versuchte, war wahrscheinlich die einfachste. Die GET-Aktion gibt die JPA-Entität zurück, die problemlos in JSON serialisiert werden kann. Bei der Aktualisierung wird das Objekt als JSON zurückgegeben, mit dem eine getrennte Entität gefüllt werden kann. Dies kann mit der JPA merge() -Methode in der Datenbank gespeichert werden.
Pros
einfache Architektur mit weniger Code-Duplizierung (das heißt kein DTO)
Cons
Soweit ich das funktioniert nur sagen kann, wenn man das ganze Modell um passieren. Wenn Sie versuchen, bestimmte Felder auszublenden, z. B. das Kennwort für eine Benutzerentität, denkt die Zusammenführung, dass Sie versuchen, diese Felder in der Datenbank auf Null zu setzen. Nicht gut!
2. DTO mit JPA finden() und Dozer
Next Ich dachte, ich bei Verwendung von Datentransferobjekte aussehen würde. Anscheinend ein Anti-Pattern, aber einen Blick wert. Der Dienst erstellt nun basierend auf der Entität eine DTO-Instanz, und dieses DTO wird in JSON serialisiert. Das Update ruft dann die Entität mithilfe einer find() -Methode aus der Datenbank ab, und die Werte müssen vom DTO in die Entität kopiert werden. Ich habe versucht, diese Zuordnung mit dem Dozer-Framework zu automatisieren.
Pros
Sie müssen nicht das gesamte Modell zurück. Wenn Sie bestimmte Felder haben, die nicht aktualisiert werden sollen, können Sie sie vom DTO entfernen und sie können nicht versehentlich in die Entität kopiert werden. Wenn Sie dozer verwenden, müssen Sie Attribute nicht manuell von dto in entity und umgekehrt kopieren.
Cons
Es fühlt sich an wie Sie selbst zu wiederholen, wenn die DTO zu schreiben. Irgendwie müssen Sie zwischen Entitäten und DTOs abbilden. Ich habe versucht, dies mit Dozer zu automatisieren, aber es war ein bisschen enttäuschend. Es gab Dinge aus, die es nicht hätte sein sollen und um die volle Kontrolle zu bekommen, musst du xml schreiben.
3. DTO mit manueller fusionieren
Einem dritten Weg Planierraupe zu verlassen wäre und kopieren Sie einfach die Eigenschaften gegenüber dem DTO an das Unternehmen in dem Dienst. Jeder scheint Anti-Pattern zu sagen, aber es ist so, wie jede nicht-triviale Anwendung, die ich in der Vergangenheit gesehen habe, funktioniert hat.
Zusammenfassung
Es scheint, eine Entscheidung zu sein, zwischen den Dinge einfach für den Entwickler zu halten, aber nicht die Kontrolle über den Ein-/Ausgang oder einen robustere Web-Service zu machen, sondern ein Anti-Muster in dem Verfahren zu verwenden. ..
Habe ich etwas verpasst?Vielleicht gibt es eine schwer fassbare Alternative?