@OneToMany सूची <> बनाम सेट <> अंतर


94

अगर मैं उपयोग करता हूं तो क्या कोई अंतर है

@OneToMany
public Set<Rating> ratings;

या अगर मैं उपयोग करता हूं

@OneToMany
public List<Rating> ratings;

दोनों ठीक काम करते हैं, मुझे सूची और एक सेट के बीच अंतर पता है, हालांकि मुझे नहीं पता कि क्या इससे कोई अंतर पड़ता है कि हाइबरनेट (या बल्कि जेपीए 2.0) इसे कैसे संभालता है।

जवाबों:


109

एक सूची, यदि कोई सूचकांक स्तंभ निर्दिष्ट नहीं है, तो बस एक बैग के रूप में हाइबरनेट (कोई विशिष्ट आदेश नहीं) द्वारा नियंत्रित किया जाएगा।

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

हाइबरनेट के साथ सेट का उपयोग करना अक्सर मुश्किल होता है जब आपको परिभाषित करना होता है equalsऔर hashCodeसंस्थाओं पर और इकाई में एक अपरिवर्तनीय कार्यात्मक कुंजी नहीं होती है।


3
और सूची के साथ क्या होता है, इसके विस्तार के लिए, stackoverflow.com/q/1995080/2495717 देखें ।
बेन ३०००

31

यदि आप एक सूची का उपयोग करते हैं, तो आप गेट्टर फ़ंक्शन में एक 'ऑर्डर बाय' क्लॉज निर्दिष्ट कर सकते हैं। आप एक सेट के साथ ऐसा नहीं कर सकते। खंड द्वारा आदेश में आंशिक EJBQL हो सकता है; उदाहरण के लिए

@OneToMany
@OrderBy("lastname ASC")
public List<Rating> ratings;

यदि आप इस फ़ील्ड को खाली छोड़ देते हैं, तो सूची को प्राथमिक कुंजी के मान के आधार पर आरोही क्रम में क्रमबद्ध किया जाता है।


19
चूंकि इसने मुझे मेरे हाइबरनेट डॉक्स के लिए स्क्रैचिंग भेजी: आप एक सेट कर सकते हैं @Sort - बस डॉक्स मेंSortedSet बताए अनुसार उपयोग करें ।
मबी

लेकिन अगर आप SortedSet का उपयोग करते हैं, तो यह तुलनित्र के साथ सॉर्ट करता है, इसे डेटाबेस के "ऑर्डर" द्वारा आदेशित करने का कोई तरीका नहीं है।
samir105

चूंकि यह पुराना उत्तर है, इसलिए मैं इसे स्पष्ट करना चाहूंगा। वर्तमान में हम @OrderByपर उपयोग कर सकते हैं Set। नीचे, हाइबरनेट का उपयोग करेगा OrderedSetTypeजो एक पल को LinkedHashSetरोक देगा , इसलिए आदेश संरक्षित है। अतिरिक्त मैं LinkedHashSetइकाई में उपयोग करने का सुझाव दूंगा - संगति के लिए। स्रोत: प्रवचन.हिर्नेट। ओटी
मार्टिन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.