2009-01-28 8 views
7

मैं एक छोटा Grails ऐप लिख रहा हूं, और मैं StaleObjectStateException: को लगभग 1/10 के लिए प्राप्त करता रहता हूं: निम्नलिखित सरल कोड चलाने पर "createfoo" पर कॉल के वें। शायद मैं गोर्म का उपयोग करने के लिए सबसे अच्छा तरीका याद कर रहा हूं।Grails और StaleObjectStateException में GORM

def viewfoo = { 
    session.user.refresh() 
    // ... 
} 

def createfoo = { 
    session.user.refresh() 
    var user = session.user 
    if (param["name"]) { 
    var newFoo = new Foo() 
    newFoo.name = param["name"] 
    if (newFoo.validate()) { 
     newFoo.save() 
     if (user.validate()) { 
     user.addToFoos(newFoo) 
     } else { 
     user.discard() 
     } 
    } else { 
     newFoo.discard() 
    } 
    } 
} 

मेरे सवालों का GORM सर्वोत्तम प्रथाओं के बारे में:

इस कोड है - उस समय बचाने के लिए() -

  1. "यदि सत्यापित करें() है और कुछ-छोड़ें() "गोरम में एक नई वस्तु को जारी रखने का सही तरीका क्या है?

  2. क्या मुझे उन सभी वस्तुओं को सत्यापित करना चाहिए जिन्हें मैं सहेजने वाला हूं()? अर्थात। क्या मुझे उपरोक्त कोड में फू-ऑब्जेक्ट और उपयोगकर्ता-ऑब्जेक्ट दोनों को मान्य करना चाहिए? उपयोगकर्ता-ऑब्जेक्ट को मान्य करने से फू-ऑब्जेक्ट की स्थिति की जांच हो जाएगी?

  3. StaleObjectStateException के लायक होने के लिए मैंने क्या किया? :-)

GORM/हाइबरनेट अपवाद:

 
Caused by: Object of class [Foo] with identifier [15]: optimistic locking failed; nested exception is org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [Foo#15] 

उत्तर

2

मुझे बिल्कुल यकीन नहीं है कि आप मुद्दों को क्यों मार रहे हैं, लेकिन डोमेन ऑब्जेक्ट्स पर merge विधि है। यह आपको वर्तमान ऑब्जेक्ट को वर्तमान निरंतर संदर्भ में दोबारा जोड़ने देता है।

मुझे आपके फू के बारे में पर्याप्त जानकारी नहीं है, या आपने उपयोगकर्ता ऑब्जेक्ट के लिए क्या अनुकूलन किया है, या आप इसे पुन: पेश करने में सक्षम होने के लिए उपयोग कर रहे Grails/जावा के संस्करण के बारे में पर्याप्त नहीं जानते हैं।

मुझे लगता है कि यह उस उपयोगकर्ता ऑब्जेक्ट पर रीफ्रेशिंग के साथ कुछ करने के लिए है जो डेटाबेस संस्करण को अद्यतन करने के लिए कारण बन रहा है (और इस प्रकार सिंक से बाहर), लेकिन मुझे यकीन नहीं है।

इसके अलावा, मुझे विश्वास है कि सत्यापित करें तो त्यागने व्यवहार this post

पर grails 1.1 टिप्पणी के आधार पर में कम आवश्यक बदल रहा है और है
2

एक बात मैं नोटिस कि आप उपयोगकर्ता की बचत नहीं कर रहे हैं, भले ही आप बस इसे करने के लिए कुछ foo जोड़ दिया है। वास्तव में, उपयोगकर्ता को बचाने से foo को बचाने की आवश्यकता को रोकना चाहिए।

आपको उपयोगकर्ता को सत्यापित करने की आवश्यकता नहीं है: इसकी संपत्तियों को अविश्वसनीय स्रोत द्वारा नहीं बदला जा रहा है, और जब भी आप सहेजते हैं तो डेटाबेस-स्तरीय बाधाओं की जांच की जाती है।

आखिरकार, user.refresh() जैसी चीजें आपके कार्यों के बाहर और एक इंटरसेप्टर या फ़िल्टर में बेहतर स्थानांतरित हो जाती हैं।

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

  • कोई संबंधित समस्या नहीं^_^