2011-07-03 28 views
61

है वहाँ कोई अंतर अगर मैं का उपयोग@OneToMany सूची <> बनाम सेट <> अंतर

@OneToMany 
public Set<Rating> ratings; 

या अगर मैं

@OneToMany 
public List<Rating> ratings; 

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

उत्तर

77

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

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

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

+1

और किसी सूची के साथ क्या होता है, इसके विवरण के लिए, http://stackoverflow.com/q/1995080/2495717 देखें। – ben3000

26

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

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

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

+12

चूंकि उसने मुझे अपने हाइबरनेट डॉक्स के लिए स्कैम्बलिंग भेजा है: आप * सेट * 'सॉर्ट करें 'सेट सेट कर सकते हैं - बस' सॉर्टेडसेट 'का उपयोग करें [डॉक्स में] [http://docs.jboss.org/hibernate/orm/4.2/मैनुअल/en-US/html_single/# संग्रह-क्रमबद्ध)। – mabi

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