10

我执行以下操作:

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

// some other code

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

这是我得到的例外:

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)

我怎样才能防止这个错误?什么是最好的解决方案?

我发现了不同的方法:

  1. 在这里你可以使用discard()
  2. 在这里你可以使用merge()

我应该使用哪一个?

4

1 回答 1

10

您应该使用合并 - 它会更新对象以匹配数据库中的当前状态。如果您使用丢弃它会将对象重置回数据库所拥有的,丢弃任何更改。休眠会话中的所有其他内容都需要您自己管理。

更重要的是代码应该写在一个服务中,这样就有一个数据库事务,你应该使用

save(flush:true) 

只在最后一次。

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)
于 2013-09-03T17:23:09.217 回答