私は次のことをします:
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)
このエラーを防ぐにはどうすればよいですか?そのための最良の解決策は何ですか?
私はさまざまなアプローチを見つけました:
どちらを使うべきですか?
マージを使用する必要があります-データベースの現在の状態に一致するようにオブジェクトを更新します。破棄を使用すると、オブジェクトがデータベースの状態にリセットされ、変更が破棄されます。休止状態のセッションの他のすべては、自分で管理する必要があります。
さらに重要なことに、データベーストランザクションが発生するようにコードをサービスで記述し、次を使用する必要があります。
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)