NHibernate में सेट बनाम बैग की सूची


109

NHibernate मैपिंग फ़ाइल में सूची, सेट और बैग के बीच क्या अंतर है? कैसे प्रत्येक .NET संग्रह से संबंधित है?

जवाबों:


230

NHibernate शब्दार्थ:

  1. सूची: संस्थाओं के संग्रह का आदेश दिया, डुप्लिकेट की अनुमति दी। IListकोड में .NET का उपयोग करें । इंडेक्स कॉलम को NHibernate में मैप करना होगा।

  2. सेट करें: अद्वितीय संस्थाओं का अनियोजित संग्रह, डुप्लिकेट की अनुमति नहीं है। Iesi.Collection.ISetकोड में उपयोग करें (v4 से पहले NH) या System.Collections.Generic.ISet(NH v4 +)। ओवरराइड करना GetHashCodeऔर Equalsडुप्लिकेट की व्यावसायिक परिभाषा को इंगित करना महत्वपूर्ण है । एक क्रम को परिभाषित करने या एक SortedSetपरिणाम में जिसके परिणामस्वरूप तुलना को परिभाषित करके हल किया जा सकता है ।

  3. बैग: संस्थाओं की अनियंत्रित सूची, डुप्लिकेट की अनुमति। ICollection<T>कोड में .NET का उपयोग करें । सूची के सूचकांक स्तंभ को मैप नहीं किया गया है और NHibernate द्वारा सम्मानित नहीं किया गया है।


पुन :: # 2, हम ISetबजाय नियमित रूप से उपयोग नहीं कर सकते Iesi?
सर्गेई टैचेनोव

@SergeyTachenov: stackoverflow.com/questions/9222058/… एक संभावित उत्तर के लिए देखें । जब यह उत्तर लिखा गया था कि आईएसईटी .net का हिस्सा नहीं था
माइकल गट्टूसो

उस सवाल का कम से कम लोकप्रिय जवाब हाँ है, चूंकि NHibernate 4. तो शायद इस सवाल को भी संपादित करने की आवश्यकता है।
सर्गेई टैचेनोव

21

NHibernate में ये सभी वस्तुएं इन सार डेटा प्रकारों (ADT) के अन्य कार्यान्वयन के समान हैं। मुझे आश्चर्य हुआ कि सेट्स और बैग्स को ऑनलाइन खोजना कितना मुश्किल है क्योंकि अन्य चीजों के लिए नाम कितने सामान्य हैं, इसलिए मैंने यहां कुछ लिंक और विवरण सूचीबद्ध किए हैं।

अधिक विस्तृत जानकारी के लिए निम्नलिखित पर एक नज़र डालें: सूचियाँ , सेट और बैग

सामान्य नियम हैं:

सूचियाँ डिफ़ॉल्ट रूप से क्रमबद्ध होती हैं, यदि आप किसी वस्तु को उसके सूचकांक द्वारा बाहर निकालने में सक्षम होना चाहते हैं, तो इनका उपयोग करें या आपको forछोरों से अधिक अजीब तरह का शौक है foreach। आपको उन तक पहुंचने की आवश्यकता नहीं है जैसे कि आपको एक लिंक्ड सूची में आवश्यकता होगी । यह ADT डुप्लिकेट को अनुमति देता है।

कृपया ध्यान दें! हालाँकि, सूचियों को ब्रायनड के रूप में वर्णित किया गया है, उनके उत्तर में यह कहते हुए पूरी तरह से कुछ भी नहीं है कि यह उस क्रम में होना चाहिए जब आप किसी HQL क्वेरी को निष्पादित करते हैं जब तक कि आप आदेश द्वारा एक आदेश निर्दिष्ट नहीं करते। यह इस वजह से है कि कुछ लोग इसके बजाय सेट या बैग का उपयोग करना पसंद करते हैं, ताकि यह आदेश दिए जाने का भ्रम न दे। हालांकि मैं यह कहता हूं, अधिकांश समय वे एक दृश्यमान क्रम में दिखाई देंगे, क्योंकि वे इस क्रम में सूची में जोड़े जाते हैं कि वे क्वेरी में पाए जाते हैं जो NHibernate चलाता है।

सेट डिफ़ॉल्ट रूप से क्रमबद्ध नहीं होते हैं , आप किसी भी चर को सीधे सूचकांक के माध्यम से एक्सेस नहीं कर सकते हैं। सेट डिफ़ॉल्ट रूप से उपरोक्त तीनों में से एकमात्र ADT है जो अपनी वस्तुओं की विशिष्टता बनाए रखता है । यदि आपके पास डुप्लिकेट शामिल नहीं करने की आवश्यकता है, तो आपके पास एक संग्रह है, तो ये बहुत अच्छे हैं।

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

NHibernate में इनका उपयोग कैसे किया जाता है, इस संबंध में, डेटाबेस से अलग से कुछ भी नहीं निकाला जाता है, इस पर निर्भर करता है कि आप किस ADT का चयन करते हैं, यह वही है जो आप इसका उपयोग करना चाहते हैं, इसके लिए आपको अलग-अलग ADT का चयन करना चाहिए।

व्यक्तिगत रूप से, मैं ज्यादातर चीजों के लिए सेट का उपयोग करता हूं क्योंकि मुझे आमतौर पर बाल वस्तुओं को अद्वितीय होने की आवश्यकता होती है और आदेश देना कोई मुद्दा नहीं है। हालाँकि मैं उन सूचियों का उपयोग करूँगा जहाँ मेरे पास वस्तुओं का एक समूह है जो मुझे किसी चीज़ के लिए आदेश दिया गया है, उदाहरण के लिए, इस आदेश को प्राप्त करने के लिए मुझे HQL क्वेरी में "ऑर्डर" को मैन्युअल रूप से सेट करने की आवश्यकता है।


2
सूची पर सुधार - एक NHibernate मानचित्रण फ़ाइल में एक सूची का उपयोग करके एक सूचकांक कॉलम को मैप करने की आवश्यकता होगी। इस तरह इस सूची को उस सटीक क्रम में बाहर निकाला जाएगा जो इसमें डाला गया था।
माइकल गट्टूसो

@ मिचेल गट्टूसो अच्छा बिंदु, मुझे ऊपर दिए गए जवाब में उल्लेख करना चाहिए था कि मैं आपकी मानचित्रण फ़ाइल में वास्तविक संग्रह विनिर्देश के बजाय एचक्यूएल प्रश्नों (इसलिए 'टिप्पणी द्वारा आदेश') के बारे में बात कर रहा था।
Jay

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

1

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


0

सेट करें कि आप इसमें बार-बार तत्व नहीं डाल सकते। यदि आप कुछ नए तत्व जोड़ने की कोशिश करेंगे, तो यह तुलना करेगा (समान पद्धति का उपयोग किया जाता है) प्रत्येक तत्व जो आपके द्वारा जोड़े जाने के साथ पहले से ही संग्रह में है, और यदि कोई सही है, तो तत्व जोड़ा नहीं जाएगा

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.