2011-11-13 9 views
11

में session.lock विधि का उद्देश्य क्या है, मैं हाइबरनेट के lock method से जा रहा हूं। मुझे यह नहीं मिला कि हम इस विधि के माध्यम से क्या हासिल करने की कोशिश कर रहे हैं।हाइबरनेट

p1 = (Person)session. get(Person.class,1);// person name is scott here 
// here peson name got update to henry by anothet thread 
session. lock(person, LockMode.READ) line 3 
// still name is henry too 

मैं कोड स्निपेट के ऊपर करने की कोशिश की लेकिन यह लाइन पर डेटाबेस से व्यक्ति पढ़ नहीं था 3. प्रलेखन का कहना है कि यह एक संस्करण जाँच करने के लिए इस्तेमाल किया जा सकता है।

यह सुनिश्चित नहीं है कि यह संस्करण कैसे जांचता है और किसी भी परिदृश्य में डेवलपर की सहायता करता है?

इसी तरह से सुनिश्चित नहीं है कि session.lock(person, LockMode.None) क्या हासिल करेगा। प्रलेखन का कहना है कि LockMode.NONE का उपयोग सत्र के साथ एक क्षणिक उदाहरण को फिर से जोड़ने के लिए किया जाता है।

सुनिश्चित नहीं है कि सत्र के साथ एक क्षणिक उदाहरण को पुन: संयोजित करके इसका क्या अर्थ है। एक संक्षिप्त परिदृश्य एक बड़ी मदद होगी?

उत्तर

11

विभिन्न लॉक-मोड का अर्थ इकाई को संशोधित होने से रोकने और एक साथ कई स्रोतों से पढ़ने के लिए है, विवरण के लिए pessimistic locking के बारे में प्रलेखन प्रविष्टि देखें। मेरे अनुभव में, ये शायद ही कभी की जरूरत है, के रूप में डेटाबेस अलगाव स्तर आम तौर पर जरूरत के रूप में ताला लगा का ख्याल रखता है:

यह इरादा नहीं है कि उपयोगकर्ताओं को रणनीतियों पर ताला लगा के बारे में चिंता ज्यादा समय बिताते हैं। आमतौर पर जेडीबीसी कनेक्शन के लिए अलगाव स्तर निर्दिष्ट करने के लिए पर्याप्त होता है और फिर डेटाबेस को सभी काम करने दें। हालांकि, उन्नत उपयोगकर्ता विशेष निराशावादी ताले प्राप्त कर सकते हैं या नए लेनदेन की शुरुआत में ताले पुनः प्राप्त कर सकते हैं।

"सत्र के साथ एक क्षणिक उदाहरण reassociating" का सवाल है (मैं वास्तव में लगता है कि वे अलग उदाहरण मतलब है?), निम्न चित्र (Hibernate entity lifecycle) पर विचार करें:

Hibernate entity lifecycle

यह वर्णन है

हाइबरनेट परिभाषित करता है और समर्थन करता है, निम्नलिखित वस्तु राज्यों:

से
  • क्षणिक - एक ऑब्जेक्ट क्षणिक है अगर इसे नए ऑपरेटर का उपयोग करके तुरंत चालू किया गया है, और यह एक हाइबरनेट सत्र से संबद्ध नहीं है। इसका डेटाबेस में कोई लगातार प्रतिनिधित्व नहीं है और पहचानकर्ता मान असाइन किया गया है। यदि अनुप्रयोग में संदर्भ नहीं है तो क्षणिक उदाहरण कचरा कलेक्टर द्वारा नष्ट होगा। ऑब्जेक्ट लगातार ऑब्जेक्ट बनाने के लिए हाइबरनेट सत्र का उपयोग करें (और Hibernate को SQL संक्रमणों का ख्याल रखना चाहिए जो को इस संक्रमण के लिए निष्पादित करने की आवश्यकता है)।
  • पर्सिस्टेंट - एक सतत उदाहरण डेटाबेस और एक पहचानकर्ता मान में एक प्रतिनिधित्व है। यह केवल सहेजा या लोड किया जा सकता है, हालांकि, यह सत्र के दायरे में परिभाषा है। हाइबरनेट पर किए गए किसी भी परिवर्तन को लगातार स्थिति में किसी ऑब्जेक्ट का पता लगाएगा और काम की इकाई पूर्ण होने पर डेटाबेस के साथ राज्य को सिंक्रनाइज़ करेगा।डेवलपर्स मैन्युअल अपडेट स्टेटमेंट निष्पादित नहीं करते हैं, या किसी ऑब्जेक्ट को को क्षणिक बनाते समय हटाएं।
  • अलग - एक अलग उदाहरण एक ऑब्जेक्ट है जो लगातार रहा है, लेकिन इसका सत्र बंद कर दिया गया है। का संदर्भ ऑब्जेक्ट अभी भी मान्य है, और अलग-अलग उदाहरण भी इस स्थिति में संशोधित किया जा सकता है। बाद में बिंदु पर एक अलग सत्र को को नए सत्र में दोबारा जोड़ा जा सकता है, जिससे इसे (और सभी संशोधनों) लगातार बना दिया जा सकता है। यह सुविधा प्रोग्रामिंग मॉडल को लंबे समय तक चलने वाली इकाइयों के लिए सक्षम बनाता है जिसके लिए उपयोगकर्ता सोच-समय की आवश्यकता होती है। हम उन्हें एप्लिकेशन लेनदेन कहते हैं, यानी उपयोगकर्ता के बिंदु से कार्य की एक इकाई।