2010-03-04 3 views
5

Ich habe ein Domänenobjekt, das Ergebnisse einer Berechnung basierend auf Parametern enthält, die Eigenschaften desselben Domänenobjekts sind. Ich möchte sicherstellen, dass alle Zeitparameter vom Benutzer geändert werden, es neu berechnet und ordnungsgemäß in der Datenbank gespeichert wird.Ändern des Objekts in AfterInsert/AfterUpdate

Ich versuche, dies mit AfterInsert (um sicherzustellen, dass die Berechnung in erster Linie korrekt ist) und AfterUpdate.

Da meine Berechnung jedoch versucht, das Objekt selbst zu ändern, funktioniert es nicht - verschiedene Ausnahmen im Ruhezustand werden ausgelöst.

Ich habe versucht, den AfterUpdate-Code in eine Transaktion zu setzen, aber das hat nicht geholfen. Ich fürchte, ich komme hier in eine zirkuläre Abhängigkeitsproblematik.

Die Ausnahme, die ich jetzt bin immer ist:

org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [esc.scorecard.PropertyScorecard#27] 

Sind die GORM Veranstaltungen für einfachere Anwendungsfälle konzipiert? Ich bin versucht zu schließen, dass es nicht der richtige Weg ist, das Objekt zu verändern, in dem man sich gerade befindet.

+0

was mit diesem Problem Abhilfe Ihre ist. Ich stehe auch vor diesem Dilemma. * .withNewSession * scheint nicht für afterInsert zu funktionieren. Ich kann das Objekt weder spülen noch speichern (naja, ich kann .save()) aber es scheint, dass die Berechnungen, die ich im afterInsert gemacht habe, nicht in der Datenbank gespeichert sind, wenn ich einfach .save()) verwende. Vielen Dank! Anyway, was ich nur tun möchte, ist, ein Benutzer-Objekt innerhalb meiner Domain-Klasse (z. B. Nachricht), die es erstellt haben. Da Audit-Trail nur eine Long-Referenz speichert (z. B. createdby), kann ich die Klasse der Nachrichtendomäne möglicherweise nicht manipulieren und schließlich auf ihr Attribut referenzieren –

Antwort

2

Gibt es einen Grund gegen die Verwendung von beforeInsert und beforeUpdate statt afterInsert und afterUpdate?

Wenn nicht, an die Schalt before* Event-Handler sollte Ihr Problem beheben

+1

Ich dachte, dass nach der Zeit nachInsert Brände das Objekt fast beibehalten wird und ein Zu diesem Zeitpunkt, aber ich könnte falsch liegen - der gesamte Persistenzprozess (mit Ereignissen) scheint nicht gut dokumentiert zu sein. –

+0

Wenn Ihre Berechnung die ID-Eigenschaft verwendet, kann es in der Tat ein Problem sein, Ihren Code in before * -Handlern zu finden. Und ich weiß nicht, welches Ereignis ausgelöst wird, wenn ID generiert wird. – fabien7474

3

Sie 1.2.0+ verwenden?

Wenn dies der Fall ist, können Sie .withNewSession in den Events Closures verwenden, um das Chaos im Winterschlaf zu vermeiden.

prost

Lee

+0

ja, ich bin auf 1.2.1. Ich habe versucht, mitNewSession, aber das hat nicht geholfen, was zu seltsamen Winterschlaf Fehler. –

Verwandte Themen