2013-09-03 41 views
9

I wykonaj następujące czynności:StaleObjectStateException: Wiersz został zaktualizowany lub usunięty przez inną transakcję?

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

// some other code 

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

to wyjątek uzyskać:

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) 

Jak mogę zapobiec występowaniu tego błędu? Jakie jest najlepsze rozwiązanie?

znalazłem różne podejścia:

  1. here, które można wykorzystać discard()
  2. here, które można wykorzystać merge()

Które należy użyć?

Odpowiedz

10

Należy użyć funkcji scalania - zaktualizuje obiekt, aby dopasować go do bieżącego stanu w bazie danych. Jeśli użyjesz odrzucić, zresetuje obiekt z powrotem do bazy danych, odrzucając wszelkie zmiany. Wszystko inne w sesji hibernacji, którą musisz sam zarządzać.

ważniejsze kod powinien być napisany w służbie tak, że nie jest to transakcja bazy danych i należy użyć

save(flush:true) 

tylko raz na końcu.

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

Czy możesz przepisać mój kod w sposób, który Twoim zdaniem powinien być? –

+0

Sprawdź teraz i daj mi znać, jeśli masz jakiekolwiek wątpliwości. Dzięki!!! –