2013-09-03 8 views
9

ich folgendes:StaleObjectStateException: Zeile wurde von einer anderen Transaktion aktualisiert oder gelöscht?

def currentUser = springSecurityService.currentUser 
currentUser.name = "test" 
currentUser.save(flush: true) 

// some other code 

currentUser.gender = "male" 
currentUser.save(flush: true)  // Exception occurs 

Dies ist die Ausnahme, die ich erhalten:

ERROR events.PatchedDefaultFlushEventListener - Could not synchronize database state with session 
org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect) 

Wie kann ich verhindern, dass diese Fehlermeldung? Was ist die beste Lösung dafür?

ich verschiedene Ansätze gefunden:

  1. here, die Sie discard()
  2. here verwenden können, die Sie merge()

Welches sollte ich verwenden kann?

Antwort

10

Sie sollten die Zusammenführung verwenden - sie aktualisiert das Objekt so, dass es dem aktuellen Status in der Datenbank entspricht. Wenn Sie "Verwerfen" verwenden, wird das Objekt auf die Datenbank zurückgesetzt, wobei alle Änderungen verworfen werden. Alles andere in der Ruhezustand-Sitzung müssen Sie selbst verwalten.

Noch wichtiger Code sollte in einem Dienst geschrieben werden, so dass es eine Datenbanktransaktion ist, und Sie sollen

save(flush:true) 

nur einmal am Ende verwenden.

def currentUser = springSecurityService.currentUser 
currentUser.name = "test" 

// currentUser.save(flush: true) // removing this line because if a rollback occurs, then changes before this would be persisted. 


// some other code 

currentUser.gender = "male" 
currentUser.merge()     // This will merge persistent object with current state 
currentUser.save(flush: true) 
+0

Können Sie meinen Code bitte so umschreiben, wie Sie es für richtig halten? –

+0

Bitte überprüfen Sie jetzt und lassen Sie mich wissen, wenn Sie irgendwelche Bedenken haben. Vielen Dank!!! –