2013-09-03 6 views
9

मैं निम्नलिखित है:StaleObjectStateException: पंक्ति को किसी अन्य लेनदेन द्वारा अपडेट या हटा दिया गया था?

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) 

मैं कैसे इस त्रुटि से बचने कर सकते हैं:

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

// some other code 

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

यह अपवाद मैं कर रहा है? इसके लिए सबसे अच्छा समाधान क्या है?

  1. here कि आप discard()
  2. here उपयोग कर सकते हैं कि आप उपयोग कर सकते हैं merge()

कौन सा का उपयोग करना चाहिए:

मैं अलग दृष्टिकोण पाया?

उत्तर

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) 
+0

क्या आप कृपया मेरे कोड को फिर से लिख सकते हैं जैसा आपको लगता है कि यह होना चाहिए? –

+0

कृपया अभी जांचें और अगर आपको कोई चिंता हो तो मुझे बताएं। धन्यवाद!!! –

संबंधित मुद्दे