Frage

Betrachten Sie das Szenario: eine DB -Transaktion, die mehr als eine Zeile aus verschiedenen Tabellen mit der Versionierung umsetzt.

Zum Beispiel: Ein Ladlisten und Produkte. Wobei eine Shoplist Produkte (mit ihrem Betrag in der Shoplist) enthalten kann und Produkte ihren aktuellen Bestand haben.

Wenn ich eine Shoplist bearbeite, möchte ich, dass die Aktie dieser Produkte in der Shoplist aktualisiert wird, um die Aktienkonsequenz zu halten.

Dazu öffne ich eine Transaktion, füge die Shoplist ein, aktualisiere die Aktien für jedes Produkt (Delta anwenden) und beite dann die Transaktion. Bisher keine große Sache.

Ein anderer Benutzer hat jedoch möglicherweise ein oder mehrere Produkte gemeinsam aktualisiert. Oder sogar die Shoplist selbst aktualisiert. In beiden Fällen würde ich beim Abenden der Transaktion eine StaleObjectStateException erhalten.

Frage ist: Gibt es eine Möglichkeit, zu bestimmen, welche Tabelle die StaleObjectStateException verursacht hat?

Falls das Produkt die Ausnahme verursachte, konnte ich alle umgebildeten Produkte aus der DB auffrischen und dann die Aktiendeltas erneut anwenden. Und das ist in Ordnung. Falls die Shoplist die Ausnahme verursachte, wäre es besser, das Problem einfach dem Benutzer zu melden, damit er erneut anfangen kann.

Vielen Dank für Ihre Hilfe.

War es hilfreich?

Lösung

Ich fand heraus, wie.

Das Wichtigste zuerst: Der JPA (oder das Selbsthinne selbst) wickelt die org.hiNNate.staleObjectStateException als javax.persistence.optimisticLockexception aus. Wenn Sie also die richtige Ausnahme einholen möchten, entscheiden Sie sich für optimisticLockexception.

Zweitens: Der Hibernate wirft nur die optimisticLockexception auf, wenn Sie die Methode von EntityManager vor dem Commit nennen. Wenn Sie das Commit direkt anrufen, erhalten Sie stattdessen eine weitere Ausnahme (ich habe vergessen, welche). In Anbetracht dessen, dass fast jeder die von der Commit -Methode herausgegebenen Ausnahmen fängt und sich für einen Transaktionsrollback entscheidet, erhalten Sie eine Rollback -Ausnahme (können Sie sich nicht einmal erinnern).

Dritte und endgültig beantworten Sie meine ursprüngliche Frage: Sie müssen nur die GetEntity -Methode von der OptimisticLockexception -Instanz aufrufen, um den Ursprung des Versionsfehlers zu erhalten. Das wird Ihnen alles zur Verfügung stellen, was Sie damit in Bezug auf das benötigen.

Danke für alle, die hier vorbeigegangen sind. Alle Fragen dazu, stellen Sie nur und ich werde gerne helfen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top