lazy="true"
और lazy="proxy"
के बीच निबर्ननेट में क्या अंतर है?nhibernate आलसी लोड विकल्प
उत्तर
आलसी = "प्रॉक्सी" का अर्थ है कि एनएचबेर्नेट आपके वर्ग के उदाहरणों को आलसी शुरू कर देगा; जब NHibernate डेटाबेस से आपकी कक्षा का एक उदाहरण पुनर्प्राप्त करता है, तो यह होगा - इस मामले में - आपकी कक्षा का 'असली' उदाहरण वापस न करें, लेकिन यह आपको प्रॉक्सी देगा। यही है, यह किसी अन्य प्रकार की वस्तु को वापस कर देगा, विशेष रूप से, एक वस्तु जो आपकी कक्षा का उप-वर्ग है (आईएल पीढ़ी के माध्यम से एनएचबीरनेट द्वारा उत्पन्न)।
ऑब्जेक्ट जो आपको दिया जाएगा, एक प्रॉक्सी है, और एकमात्र आबादी वाली संपत्ति, आईडी संपत्ति है। जैसे ही आप उदाहरण पर किसी अन्य संपत्ति को कॉल करते हैं, NHHernate प्रॉक्सी को प्रारंभ करेगा, और डेटाबेस से सभी अन्य गुण/संग्रह (आलसी लोड किए गए को छोड़कर) पुनर्प्राप्त करेगा।
आलसी = "सत्य" किसी अन्य स्तर पर उपयोग किया जाता है। जबकि आलसी = "प्रॉक्सी" वर्ग-स्तर पर प्रयोग किया जाता है, संग्रह स्तर पर आलसी = "सत्य" का उपयोग किया जाता है। इसका मतलब है कि संग्रह आलसी भरा होना चाहिए।
documentation reference का कहना है कि प्रॉक्सी विशेषता के मान में है:
lazy="proxy|no-proxy|false"
आलसी (वैकल्पिक - प्रॉक्सी के लिए चूक): डिफ़ॉल्ट रूप से, एकल बिंदु संघों प्रॉक्सी कर रहे हैं।
आलसी = "नो-प्रॉक्सी" निर्दिष्ट करता है कि आवृत्ति चर पहली बार पहुंचने पर संपत्ति को आलसी ढंग से लाया जाना चाहिए (बिल्ड-टाइम बाइटकोड उपकरण की आवश्यकता है)।
आलसी = "झूठा" निर्दिष्ट करता है कि एसोसिएशन हमेशा उत्सुकता से लाया जाएगा।
आलसी = "प्रॉक्सी" निर्दिष्ट नहीं करना चाहिए कि संपत्ति को आलसी प्राप्त किया जाना चाहिए जब आवृत्ति चर पहली बार –
एक्सेस किया गया है और अधिक जानकारी ऐंडे के ब्लॉग पर मिल सकती है: http://ayende.com/Blog/archive/2010/01/ 28/nhibernate-new-feature-no-proxy-associations.aspx –
मैंने बस इसे दोबारा सुधार दिया ताकि विकल्प अंतर रेखाओं पर हों। –
डिफ़ॉल्ट रूप से, हाइबरनेट 3 एकल मूल्यवान संघों के लिए संग्रह और आलसी प्रॉक्सी लाने के लिए आलसी चयन लाने का उपयोग करता है। ये डिफ़ॉल्ट अधिकांश अनुप्रयोगों में अधिकांश संगठनों के लिए समझ में आता है।
http://docs.jboss.org/hibernate/stable/core/reference/en/html_single/#performance-fetching-lazy
मैं इसके बारे में सोच यह होगा का एक और तरीका संदेह है।
class Foo
{
public virtual Bar SingleBar { get; set; }
public virtual ICollection<Bar> MultiBar { get; set; }
}
- आलसी = "प्रॉक्सी" एकल वस्तुओं (यानी foo.SingleBar)
- आलसी = "true" वस्तुओं के संग्रह पर लागू होता है पर लागू होता है (यानी foo.MultiBar)
(आप संग्रह में आलसी = "प्रॉक्सी" सेट नहीं कर सकते हैं, न ही आप एक संदर्भ में आलसी = "सत्य" सेट कर सकते हैं। या तो एनएच को एक्सएमएलस्केमाएक्सप्शन फेंकने का कारण बन जाएगा जो शुरुआती लोगों के लिए थोड़ा सा गूढ़ है।)
परिचालन वे वही abstr करते हैं कार्य की बात: जब और जब संपत्ति का उपयोग किया जाता है तो NHBernate डेटाबेस को हिट करता है और संपत्ति को पॉप्युलेट करता है।
हालांकि वस्तुओं को लाने के लिए आवश्यकतानुसार कार्यान्वयन में थोड़ा सा अंतर है (एक मामले में, संदर्भ आईडी (बार) मूल इकाई (फू) के साथ लोड किया गया था। संग्रह मामले में, आईडी अज्ञात हैं और किसी अन्य तालिका में पाए जाना चाहिए)
ऐप में मैं काम कर रहा था "प्रॉक्सी" और "सच" के बीच एक अंतर था। यदि विदेशी कुंजी के पास एक मूल्य था जो संबंधित तालिका में मौजूद नहीं था, आलसी = "सत्य" ने लिंक क्वेरी के दौरान ऑब्जेक्ट नॉटफाउंड अपवाद को फेंक दिया, जबकि आलसी = "प्रॉक्सी" अपेक्षित के रूप में काम करता था। –
और फिर आलसी = "सत्य" में क्या अंतर है? –
ऐसा लगता है कि आपने प्रश्न का उत्तर नहीं दिया था। – gdoron