JPA: OptimisticLockException und Cascading
In meinem aktuellen Projekt verwende ich Spring Data JPA mit Hibernate, aber betrachten Sie dies als eine mehr Allgemeine Frage, die sollte auch für "normale" JPA.
Ich bin unsicher, wie ich damit umgehen soll OptimisticLockException
bei der Verwendung @Version
.
Daran, wie mein Programm arbeitet einige Beziehungen haben CascadeType.PERSIST
und CascadeType.REFRESH
, andere haben auch CascadeType.MERGE
.
- Wo zu behandeln
OptimisticLockException
Soweit ich sagen kann der Umgang mit diesem auf dem service-layer wird nicht funktionieren, vor allem mit CascadeType.MERGE
da dann der säumige Person könnte einer sein, der verarbeitet werden muss, die von einem anderen Dienst ( ich habe einen service pro entity-Klasse).
Problem ist, ich bin ein framework erstellen, und daher gibt es keine Ebene darüber-Dienst, so konnte ich nur ein "delegieren" Sie diese, um den Benutzer über meinem Rahmen, aber das scheint "zu schwach und faul".
- Ermitteln säumige Person und Felder, die geändert
wenn ein OptimisticLockException Auftritt, wie bekomme ich die Entität, die das Problem verursacht hat und welche Felder wurden geändert?
Ja, ich kann anrufen getEntity()
aber wie kann ich die Besetzung, um den richtigen Typ vor allem, wenn CascadeType.MERGE verwendet wurde? Die Person konnte mit mehreren Typen, so ein if/switch mit instanceof
den Sinn kommt, aber das scheint hässlich wie die Hölle.
Sobald ich die korrekte Art würde ich brauchen, um alle Unterschiede zwischen den Versionen (mit Ausnahme bestimmter Bereiche wie die version selbst oder lastModifiedDate.
In meinem Hinterkopf ist auch HTTP 409 die besagt, dass im Falle eines Konflikts Antwort enthalten sollte, die Konflikt Felder.
Gibt es ein "best-practice-Muster" für all dies?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Der springende Punkt, der das optimistische sperren ist in der Lage sein zu sagen, die end-user: Hey, Sie versucht zu retten, dieses wichtige Stück von Informationen, sondern von jemand anderem gerettet, es hinter Ihrem Rücken, so würden Sie besser aktualisieren Sie die Informationen, entscheiden Sie, ob Sie immer noch wollen, um es zu speichern und möglicherweise geben Sie neuen Werte, und wiederholen Sie dann den Vorgang.
Einfach wie mit SVN, wenn Sie versuchen, eine Datei zu übergeben, und jemand anderes verpflichtet, eine neue version vor, SVN zwingt Sie, Ihre Arbeitskopie zu aktualisieren und resole potenzielle Konflikte.
Also ich würde das gleiche tun wie das, was PPV bedeutet : es können die Anrufer entscheiden, was zu tun ist, durch das werfen der Ausnahme. Diese Ausnahme behandelt werden sollten, in die Präsentationsschicht.
Wurde was mich stört, ist, dass die vorgesehenen Ausnahmen von JPA (Hibernate) und Spring nicht tatsächlich zurück die aktuelle version des fehlerhaften Objekts. Also, wenn ein Benutzer braucht, um zu entscheiden, was zu tun ist, den er offensichtlich braucht, um zu sehen, die aktualisiert, die aktuelle version. Nur verzögert ein Fehler sein Ruf scheint verzögert zu mir. Ich meine, Sie sind schon auf der Datenbank-Ebene in einer Transaktion, so dass immer der aktuelle Wert direkt hat keine Kosten...
Erstellte ich eine neue Exception, die einen Verweis auf die neueste version der Entität, die Fehler beim update:
sowie die Service-Methode
Beachten Sie die Kommentare. Im Falle von CascadeType.MERGE dies nicht funktionieren wird, wie dieser, der Logik müssten sehr viel komplexer sein. Ich habe 1 service pro entity-Typ, so dass service-müsste halten, Verweis auf alle anderen Dienstleistungen und so weiter.