2009-03-03 7 views
10

मैं एक विरासत प्रणाली के साथ काम कर रहा हूं जिसे मैं एनएचबीर्नेट को जोड़ने के साथ प्रयोग कर रहा हूं। मेरे पास कक्षा है जिसे मुझे किसी तालिका में मैप करने की आवश्यकता है, लेकिन इसमें कई मौजूदा विधियां हैं जो वर्चुअल नहीं हैं।NHibernate मानचित्रण के वर्ग तत्व पर आलसी = "झूठी" का असर क्या है?

मुझे पता चला कि मैपिंग फ़ाइल के वर्ग तत्व पर "आलसी" विशेषता को "झूठी" पर सेट करने पर मैं गैर-वर्चुअल विधियों के साथ भी सफलतापूर्वक मैपिंग लोड करने के लिए एनएचबीर्नेट प्राप्त कर सकता हूं। मैं सोच रहा हूं कि इस वर्ग के साथ एनएचबीर्नेट के उपयोग पर इसका क्या असर होगा।

मैं किसी ऑब्जेक्ट से संबंधित संग्रहों पर गैर-आलसी लोडिंग के अर्थ को समझता हूं, लेकिन मैं इस बात पर स्पष्ट नहीं हूं कि कक्षा में आलसी या उत्सुक लोडिंग क्या होगी। क्या इसका मतलब है कि उस वस्तु से संबंधित सभी संग्रह उत्सुक हो जाएंगे? या इसका मतलब यह है कि एनएचबीर्नेट अब वास्तविक वर्ग के स्थान पर गतिशील प्रॉक्सी का उपयोग नहीं करता है? कुछ और?

इसके अलावा, यहां कार्रवाई का सबसे अच्छा तरीका क्या है? उस आलसी = झूठी मान को अव्यवस्थित स्थापित कर रहा है? क्या मुझे एक इंटरफेस बनाना चाहिए जो वर्ग लागू करता है, और उसके बाद तालिका में मैप करें? या क्या मुझे सिर्फ बुलेट काटने और वर्ग वर्चुअल पर सभी मौजूदा तरीकों को चिह्नित करना चाहिए?

किसी भी और सभी सलाह के लिए अग्रिम धन्यवाद!

उत्तर

4

मैं हमेशा एनएचबीरनेट में कक्षा स्तर पर आलसी = झूठी निर्दिष्ट करता हूं, क्योंकि मैं नहीं चाहता कि एनएचबीर्नेट मुझे यह घोषणा करने के लिए मजबूर करे कि गुण मेरे वर्चुअल मॉडल में नहीं चाहते हैं।

जब आप क्लास मैपिंग (डिफ़ॉल्ट) पर 'आलसी' निर्दिष्ट करते हैं, तो NHibernate रनटाइम पर 'डायनामिक प्रॉक्सी' क्लास का उपयोग करता है। यह गतिशील प्रॉक्सी एक वर्ग है जो आपकी कक्षा से प्राप्त होती है। फिर, जहां तक ​​मैं समझता हूं, वर्ग के उदाहरण को आलसी/मांग पर शुरू किया जाना चाहिए। कुछ मामलों में, यह प्रदर्शन के लिए बेहतर होना चाहिए (कम से कम, यही बताया जा रहा है)।

लेकिन, मुझे यह पसंद नहीं है कि एनएचबीर्नेट मुझे बताता है कि मेरी कक्षा कैसा दिखना चाहिए, मैंने हमेशा अपने सभी वर्गों के लिए आलसी = झूठी निर्दिष्ट की है, और मैं अभी तक परेशानी में नहीं भाग गया हूं। :)

+0

तो, अपने उत्तर को स्वीकृत के रूप में चिह्नित करने से पहले स्पष्ट होने के लिए, वर्ग स्तर पर आलसी = झूठी सेटिंग को उस वर्ग के संग्रह को उत्सुक लोड नहीं किया जाएगा? –

+0

नहीं, कक्षा स्तर पर आलसी विशेषता संग्रह स्तर पर आलसी विशेषता पर कोई प्रभाव नहीं डालती है। (मेरे पास कक्षाएं हैं जहां मैं वर्ग स्तर पर आलसी = झूठी निर्दिष्ट करता हूं, और संग्रह स्तर पर आलसी = झूठा) –

+0

धन्यवाद, फ्रेडरिक! बहुत उपयोगी! –

2

आलसी लोडिंग का उपयोग वस्तुओं की संख्या को सीमित करने में बहुत प्रभावी है। यह सुविधा कुछ स्थितियों में बेहद उपयोगी हो सकती है। उदाहरण के लिए, कल्पना करें कि आपके पास दो ऑब्जेक्ट्स उपयोगकर्ता और भूमिका थीं और सभी उपयोगकर्ताओं के पास 1 या अधिक भूमिकाएं हैं। जब आप उपयोगकर्ता ऑब्जेक्ट लोड करते हैं, तो आप अपनी सभी संबंधित भूमिकाएं भी लोड करना चाहेंगे। हालांकि, जब आप उस उपयोगकर्ता के लिए भूमिकाएं लोड करते हैं, तो आप उस भूमिका से जुड़े सभी उपयोगकर्ताओं को लोड नहीं करना चाहते हैं क्योंकि इससे उपयोगकर्ता के पूरे डेटाबेस को लोड करना बंद हो सकता है।

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

+1

+1। आलसी आलसी या आलसी नहीं लेना वास्तव में प्रति उपयोग मामले परिभाषित किया जाना चाहिए! – Hace

1

रोब, यह सिर्फ खराब डिज़ाइन है। उपयोगकर्ता की भूमिका की सूची होगी लेकिन भूमिका में उपयोगकर्ता की सूची नहीं होगी। सभी उपयोगकर्ताओं को भूमिका में लाने के लिए उपयोगकर्ता एक समग्र रूट है, उपयोगकर्ता को GetByRole() पर एक विधि परिभाषित करें। आपके द्वारा वर्णित 2 रास्ता ट्रैवर्सल एक भयानक डोमेन मॉडल बनाते हैं। Google 'परिपत्र संदर्भ' और देखें कि यह क्यों बुरा है।

+1

व्यस्त संग्रह देखें – Min

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