मैं समझने की कोशिश कर रहा हूं कि हाइबरनेट 3.6 session.get()
और session.load()
के ऑब्जेक्ट और व्यवहार में अंतर क्या है।हाइबरनेट 3.6 - session.get() बनाम session.load()
:
प्राप्त():
वापसी दिए गए पहचानकर्ता, या अगर ऐसी कोई लगातार उदाहरण है अशक्त के साथ दिया इकाई वर्ग के लगातार उदाहरण। (उदाहरण के पहले से ही सत्र से संबद्ध है , एक गैर-आरंभिकृत उदाहरण लौटने कि उदाहरण इस विधि कभी नहीं देता है।।)
लोड():
वापसी की लगातार उदाहरण दिए गए इकाई वर्ग को दिए गए पहचानकर्ता के साथ दिया गया है, यह मानते हुए कि उदाहरण मौजूद है। यह विधि एक प्रॉक्सीकृत उदाहरण लौटा सकती है जो ऑन-डिमांड शुरू होती है, जब गैर-पहचानकर्ता विधि का उपयोग किया जाता है।
मैं तीन प्रश्न हैं:
जावाडोक कहना नहीं है जब
load()
एक प्रॉक्सी वापस कर सकती है - वहाँ किसी भी तरह से अग्रिम में यह पता करने के लिए है?जब
load()
प्रॉक्सी देता है - इसका मतलब हैload()
डेटाबेस तक नहीं पहुंच पाया, क्या मैं सही हूं? तो क्या होगा यदि मैंनेload()
को पहचानकर्ता के साथ प्रदान किया जो डेटाबेस में मौजूद नहीं है? अब सत्र में एक अमान्य आईडी के साथ प्रॉक्सी होगा (अपवाद प्राप्त किए बिना)। अब मैं एक और लगातार उदाहरण उस प्रॉक्सी को इंगित करना चाहता हूं - क्या यह काम करने जा रहा है? इस परिदृश्य के लिए मुझे प्रॉक्सी को प्रारंभ करने की आवश्यकता नहीं है, मुझे केवल इसकी आईडी चाहिए (जो कि मेरे पास अमान्य है, हालांकि यह डेटाबेस में नहीं है)। तो मुझे लगता है कि मैं पूछ रहा हूं कि मेरा विवरण सही है या नहीं, और मुझे यह सुनिश्चित करने के लिएload()
isInitialized()
के साथ लौटाई गई वस्तु के बाद जांच करने की आवश्यकता है ताकि यह सुनिश्चित किया जा सके कि यह वैध इकाई (या कम से कम एक वैध प्रॉक्सी) का प्रतिनिधित्व करता है, यानी वैध के साथ आईडी।इसके अलावा, क्या होता है यदि
load()
प्रॉक्सी देता है - तो प्रॉक्सी वह उदाहरण है जो पहले ही सत्र से जुड़ा हुआ है। फिरget()
के विवरण के अनुसार: "यदि उदाहरण पहले ही सत्र से जुड़ा हुआ है, तो उस उदाहरण को वापस करें।" -get()
प्रॉक्सी वापस करता है? चूंकिget()
के विवरण के अनुसार: "यह विधि कभी भी एक प्रारंभिक उदाहरण नहीं लौटाती है।"
धन्यवाद!
अद्यतन
सही निम्नलिखित हैं?
(ए) मुझे लगता है कि दोनों load()
और get()
पहले डीबी पर जाने से पहले सत्र कैश की जाँच करने की कोशिश करेंगे - तो यह कहना है कि उनमें से किसी को हमेशा डीबी मारता है, या हमेशा ही प्रॉक्सी रिटर्न सही नहीं होगा।
(बी) एक प्रारंभ प्रॉक्सी के रूप में आप यहां पढ़ सकते हैं, मूल उदाहरण के रूप में ही नहीं है: http://blog.xebia.com/2008/03/08/advanced-hibernate-proxy-pitfalls/
1 देखें।लेकिन अगर मेरे पास पहले से ही प्रारंभिक उदाहरण (इस आईडी के लिए) सत्र में था, तो क्या वह उस घटना को वापस नहीं करेगा, न कि प्रॉक्सी? इसके अलावा, जावाडोक कहता है: "यह विधि एक प्रॉक्सीकृत उदाहरण लौटा सकती है" - यह नहीं कहती "यह विधि हमेशा होगी"। 2. यह एक प्रकार का डिज़ाइन दोष है - जब आप प्रॉक्सी करते हैं तो आप जो कहते हैं उसके अनुसार और मैं यह सुनिश्चित करना चाहता हूं कि यह डीबी में एक वास्तविक आईडी का प्रतिनिधित्व करता है (और मैं हमेशा यह सुनिश्चित करना चाहता हूं - भले ही मैं केवल उपयोग करता हूं प्रॉक्सी को अन्य उदाहरणों को इंगित करने के लिए) - तब मुझे नहीं पता कि मैं जिस आईडी का उपयोग करता हूं वह वैध है जब तक कि मैं इसे प्रारंभ नहीं करता, लेकिन इस मामले में, प्रॉक्सी का उपयोग क्यों कर रहा है? – rapt
3. क्या आपका मतलब है कि 'लोड() 'लोड()' के बाद प्रारंभिक प्रॉक्सी, या केवल प्रारंभिक उदाहरण लौटाएगा? चूंकि यह बाद में है, तो अब हमारे पास सत्र में दो ऑब्जेक्ट्स हैं जो एक ही आईडी (प्रॉक्सी और इंस्टेंस) रखते हैं। बीटीडब्ल्यू मुझे पता है कि दो प्रॉक्सी होना संभव है जो एक ही डीबी आईडी का प्रतिनिधित्व करता है - जैसा कि आप यहां पढ़ सकते हैं: http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/ टेक्स्ट के तहत " दूसरा, प्रॉक्सी तोड़ना संभव है "। - मेरे मूल प्रश्न में अद्यतन में और देखें। – rapt
हां। आप सही हैं। आपके प्रश्न मुझे 'get() 'और' load() 'के बारे में कुछ गलतफहमी को दूर करने में मदद करते हैं। कृपया मेरे अपडेट देखें –