2013-09-03 60 views
9

tôi thực hiện như sau:StaleObjectStateException: Hàng đã được cập nhật hoặc xóa bởi một giao dịch khác?

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

// some other code 

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

Đây là ngoại lệ tôi nhận được:

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) 

Làm thế nào tôi có thể ngăn chặn lỗi này? Giải pháp tốt nhất cho điều đó là gì?

tôi thấy cách tiếp cận khác nhau:

  1. here mà bạn có thể sử dụng discard()
  2. here mà bạn có thể sử dụng merge()

Cái nào tôi nên sử dụng?

Trả lời

10

Bạn nên sử dụng hợp nhất - nó sẽ cập nhật đối tượng để khớp với trạng thái hiện tại trong cơ sở dữ liệu. Nếu bạn sử dụng loại bỏ nó sẽ đặt lại đối tượng trở lại những gì cơ sở dữ liệu có, loại bỏ bất kỳ thay đổi. Mọi thứ khác trong phiên ngủ đông bạn cần tự quản lý. Quan trọng

Nhiều mã nên được viết bằng một dịch vụ để có một giao dịch cơ sở dữ liệu, và bạn nên sử dụng

save(flush:true) 

một lần duy nhất ở cuối.

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

Bạn có thể viết lại mã của mình theo cách bạn nghĩ không? –

+0

Vui lòng kiểm tra ngay bây giờ và cho tôi biết nếu bạn có bất kỳ mối lo ngại nào. Cảm ơn!!! –