2013-09-03 10 views
9

faccio la seguente:StaleObjectStateException: la riga è stata aggiornata o eliminata da un'altra transazione?

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

// some other code 

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

questa è l'eccezione ottengo:

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) 

Come posso evitare questo errore? Qual è la migliore soluzione per questo?

ho trovato diversi approcci:

  1. here che è possibile utilizzare discard()
  2. here che è possibile utilizzare merge()

Quale dovrei usare?

risposta

10

È necessario utilizzare unire: aggiornerà l'oggetto in modo che corrisponda allo stato corrente nel database. Se si utilizza lo scarto, l'oggetto verrà reimpostato su ciò che ha il database, ignorando eventuali modifiche. Tutto il resto nella sessione di ibernazione è necessario per gestire te stesso.

Ancora più importante codice dovrebbe essere scritto in un servizio in modo che ci sia una transazione di database, e si dovrebbe usare

save(flush:true) 

una volta solo alla fine.

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

Riesci a riscrivere il mio codice nel modo in cui credi che dovrebbe essere? –

+0

Si prega di verificare ora e fammi sapere se avete qualche preoccupazione. Grazie!!! –