2011-12-21 18 views
12

मेरी हाइबरनेट कक्षाओं में उदाहरण संग्रहचाहिए लगातार कक्षाओं उदाहरण चर संग्रह प्रारंभ

public class Basket { 
    private List items = new ArrayList(); 

    ...getters and setters... 
} 

प्रारंभ या uninitalized

public class Basket { 
    private List items; 

    ...getters and setters... 
} 

यह हाइबरनेट के लिए अंतर के किसी भी प्रकार पड़ता है छोड़ दिया जाना चाहिए? मैं इस Hibernate documentation पर आया जहां यह उनके हैशसेट शुरू करता है, लेकिन मैंने उन्हें अक्सर अनियमित छोड़ दिया है।

+0

'इंस्टेंस संग्रह' से आपका मतलब 'लगातार संग्रह संपत्ति' है? –

+0

@ माइकपार्ट्रिज हाँ, यही मेरा मतलब था। – Danny

उत्तर

6
हाइबरनेट के persistent collection प्रलेखन से

:

अंतर्निहित संबंधपरक मॉडल के कारण, संग्रह-मान गुण शून्य मान अर्थ विज्ञान का समर्थन नहीं करते। हाइबरनेट एक शून्य संग्रह संदर्भ और खाली संग्रह के बीच अंतर नहीं करता है।

और ...

जब आप उदाहरण लगातार बनाने, बुला जारी रहती है (से), हाइबरनेट वास्तव में HashSet सेट हाइबरनेट के स्वयं के कार्यान्वयन का एक उदाहरण के साथ की जगह लेगा।

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

  • हमेशा java.util कार्यान्वयन के साथ सभी Collections प्रारंभ
  • हमेशा Collection करने के लिए कोड इंटरफेस

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

8

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

यदि दूसरी ओर, संग्रह का शायद ही कभी उपयोग किया जाता है, तब तक प्रारंभिकरण को स्थगित करने के लिए और अधिक समझदारी होती है जब तक आपको वास्तव में इसका उपयोग करने की आवश्यकता नहीं होती है।

0

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

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

+0

"विश्वसनीय और/या आधिकारिक स्रोतों से उत्तर देने के लिए खोज रहे हैं।" – SHiRKiT

0

मैं इसे बैकअप ले सकते हैं नहीं पेशेवर दस्तावेज के किसी भी प्रकार के साथ, लेकिन यहाँ है कि इस मामले पर मेरी राय है। मुझे लगता है कि आपके पास अनुसरण करने के लिए दो संभावित सड़कों हैं।

DTOs केवल

पहले एक मॉडल सेम पर निर्भर करता है सादा DTOs, केवल डेटा हठ के लिए इस्तेमाल किया, कोई तर्क प्रदर्शन किया जाना है। यहां आप अपने POJO फ़ील्ड्स को अनइंस्टाइज्ड छोड़ सकते हैं, क्योंकि सत्र के माध्यम से लगातार ऑब्जेक्ट पुनर्प्राप्त करने से पहले यह स्वचालित रूप से हाइबरनेट द्वारा किया जाएगा। मुझे यकीन है कि आप पहले से ही जानते हैं, कि हाइबरनेट चुपचाप सभी संग्रहों को अपने स्वयं के रैपर में लपेट लेगा, जिसे आंतरिक दृढ़ता तंत्र द्वारा आवश्यक है।

उचित मॉडल वर्गों

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

public void setItems(List<Object> items){ 
    LOGGER.info("Setting '{}' new items", items.size()); 
    this.items = items; 
} 

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

अंतिम टिप्पणी: मैं हाइबरनेट पर विशेषज्ञ नहीं हूं, मुझे यह भी नहीं पता कि 4.x में कुछ भी बदल गया है, लेकिन मुझे पता है कि मैंने इस समस्या को किसी बिंदु पर सहन किया है।

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