web-dev-qa-db-ja.com

StaleObjectStateException:行が別のトランザクションによって更新または削除されましたか?

私は次のことをします:

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()

どちらを使うべきですか?

9
user2722142

マージを使用する必要があります-データベースの現在の状態に一致するようにオブジェクトを更新します。破棄を使用すると、オブジェクトがデータベースの状態にリセットされ、変更が破棄されます。休止状態のセッションの他のすべては、自分で管理する必要があります。

さらに重要なことに、データベーストランザクションが発生するようにコードをサービスで記述し、次を使用する必要があります。

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)
10
Anuj Aneja