2012-04-12 17 views
20

मेरी समझ से @OneToOne और @ManyToOne जेपीए एनोटेशन eager fetch करते हैं। मैं चाहता हूं कि ये मेरे आवेदन में आलसी लोड हो जाएं, या कम से कम उस पर इशारा करें (जो कि हाइबरनेट को डिफ़ॉल्ट करता है)। मैं एनोटेशन fetch = FetchType.LAZYजेपीए डिफ़ॉल्ट fetch प्रकार

जैसे जोड़ने के लिए शुरू कर दिया है

@ManyToOne(optional = false, fetch = FetchType.LAZY) 

@ManyToOne(optional = false) 

के बजाय यह दोनों थकाऊ और त्रुटि की संभावना है। क्या कोई तरीका है कि मैं इसे एप्लिकेशन स्तर पर कर सकता हूं? Persistence.xml में शायद?

उत्तर

19

आज तक, मैंने एनबर्नेट को एनोटेशन के माध्यम से मैपिंग के मामले में जेपीए स्पेक का पालन करना चुना है क्योंकि मुझे कॉन्फ़िगर करने योग्य बनाने के लिए कोई फीचर अनुरोध नहीं मिला है, जो आश्चर्यजनक टीबीएच था। जैसा कि आप इंगित करते हैं, क्योंकि hbm.xml मैपिंग फ़ाइलों का उपयोग करते समय हाइबरनेट 3.0 जो आप चाहते हैं वह डिफ़ॉल्ट सेट अप हो गया है।

कॉन्फ़िगरेशन के माध्यम से इसे अनुमति देने से किसी दूसरे उत्तर के सुझाव के रूप में spec का उल्लंघन नहीं करेगा।

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

3

कोई रास्ता नहीं। जेपीए विनिर्देश में वैश्विक fetching रणनीति बदलने के बारे में कुछ भी नहीं है। जेपीए 1-1/एन -1 एसोसिएशन EAGER लाने के लिए प्रदान करता है, जबकि 1-एन/एम-एन के लिए यह LAZY है। सभी जेपीए कार्यान्वयन को अनुपालन के लिए विनिर्देश का पालन करना चाहिए। मुझे लगता है, यह बेहतर है कि एप्लिकेशन डेवलपर वैश्विक स्तर पर इस डिफ़ॉल्ट व्यवहार को नहीं बदल सकता है, क्योंकि ये लगभग सभी मामलों में सर्वोत्तम प्रथाएं हैं जब तक कि आपके पास सभी इकाइयों के बीच केवल एक प्रकार का संबंध नहीं है, जैसे 1-1। इसके बारे में सोचें, कि आप इसे किसी एप्लिकेशन में "EAGER" पर सेट कर सकते हैं, जिसमें जटिल संबंधों और डेटाबेस में लाखों डेटा वाले वास्तव में समृद्ध इकाई मॉडल शामिल हैं। प्रति संगठन लाने की रणनीति को ओवरराइड करने से मैन्युअल रूप से डेवलपर को जिम्मेदारी लेने की अनुमति मिलती है कि आगे क्या होगा। यह त्रुटि प्रवण नहीं है, इसके बजाय, एक शक्तिशाली विशेषता है।

+0

आप इसे औचित्य साबित करने के लिए एक-से-एक का उपयोग करते हैं, फिर भी कई से अधिक * एसोसिएशन के अधिक सामान्य प्रकार तक * है। हां, एक-से-एक संगठनों के मामले में उत्सुकता प्राप्त करना संभवतः बेहतर होता है। आलस्य के रूप में आलस्य होना बेहतर है क्योंकि वास्तव में इस तथ्य के साथ और अधिक करना है कि एसोसिएशन को रनटाइम (दोनों हाइबरनेट और जेपीए में) में उत्सुक बनाने के लिए बहुत से परिभाषित तरीके हैं, लेकिन उन्हें स्पष्ट रूप से बनाने के लगभग कोई तरीके नहीं हैं आलसी। –

+0

उस संदर्भ में एक-से-एक और कई से अलग कैसे हैं, कैसे कोई औचित्य साबित करता है कि दूसरा एक औचित्य साबित करने में विफल रहता है? मुझे दृढ़ता से लगता है कि इरहान में उसमें एक मुद्दा है। यदि आपके पास कोई उत्पाद है, तो ग्राहक इसे एक अलग जेपीए कार्यान्वयन के साथ उपयोग करना चाहता है। फिर या तो वे असंगतता के साथ समाप्त हो जाएंगे या उन्हें अन्य कार्यान्वयन के साथ संगत बनाने के लिए मूल कोड को संशोधित करना होगा। फिर भी आप रनटाइम पर आलसी में संबंध बदलने के लिए असंभव कहने में पूरी तरह सही हैं। –

+0

क्योंकि अनुभव कहता है कि एक-से-एक संबंध कई से अधिक बार-बार होते हैं जैसा कि मैंने पहले ही ऊपर बताया है। आप आदर्शवादी हैं; मैं व्यावहारिक हूं। मैं असली दुनिया समाधान –

1

मेरी समझ से @oneToOne और @ManyToOne जेपीए एनोटेशन उत्सुक fectch करते हैं।

जेपीए एकल मूल्यवान रिश्तों पर उत्सुक लोडिंग की गारंटी देता है, अगर अन्यथा एनोटेशन द्वारा या निरंतर एक्सएमएल के भीतर घोषित नहीं किया जाता है। संग्रह-मूल्यवान रिश्तों के लिए यह आलसी लोडिंग के लिए डिफ़ॉल्ट है, लेकिन आलसी लोडिंग (बस) जेपीए का समर्थन करने वाले दृढ़ता प्रदाता के लिए संकेत है, इसलिए आप उस पर भरोसा नहीं कर सकते हैं, और विशिष्ट प्रदाता (जैसे हाइबरनेट, ओपनजेपीए) की जांच करनी है। एक संदर्भ के रूप में, और अधिक अंतर्दृष्टि के लिए this link देखें।

6

जेपीए स्पेक मानता है कि सामान्यतः अधिकांश अनुप्रयोगों को डिफ़ॉल्ट रूप से सिंगलटन संबंधों की आवश्यकता होती है, जबकि डिफ़ॉल्ट रूप से बहु मान संबंध आलसी हो जाते हैं। और कम से कम अपने अनुभव में, यह आमतौर पर वांछित वास्तुकला है। यह समझ में आता है, क्योंकि सिंगलटन संबंधों को जेपीए परत और डीबी परत में कोई महत्वपूर्ण अतिरिक्त प्रदर्शन की आवश्यकता नहीं होती है ताकि एकल कुंजी को विदेशी कुंजी पर शामिल किया जा सके। हालांकि, इसके विपरीत, बहु मूल्यवान गुण या तो एन + 1 समस्या या बड़े कार्टेशियन परिणाम उत्पन्न करते हैं जो संग्रह में तत्वों की संख्या और जुड़ने में शामिल होने पर जुड़ने की संख्या में वृद्धि के रूप में तेजी से बढ़ते हैं (हालांकि हाइबरनेट विशेष रूप से शामिल होने पर संभाल नहीं सकता है 2+ उत्सुक संघ)।

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

यदि मैं आपके जूते में था, तो यदि आपको लगता है कि यह जेपीए विशिष्टता में जोड़ने के लिए एक बिल्कुल उपयोगी सुविधा है, तो मैं इसे जेसीपी में जमा कर दूंगा। दूसरी तरफ यदि आपको यह मिलता है (, वह और वह ...) एक विशिष्ट कार्यान्वयन में संबोधित किया जाता है तो आप तथाकथित विक्रेता-लॉकिन में समाप्त होते हैं। तो मैं @ManyToOne @OneToOne विशेषताओं पर आलसी लाने के लिए एक अतिरिक्त घंटे काम करूंगा और विक्रेता मुक्त रहूंगा, इसलिए विनिर्देशों पर चिपके हुए यदि एक नया जेपीए कार्यान्वयन 15x से अधिक तेज है तो हाइबरनेट (या जो भी कार्यान्वयन उपयोग करें), यह आपके परियोजना को नए जेपीए कार्यान्वयन को स्थानांतरित करने के लिए कोई प्रयास नहीं करेगा।

+2

आप पूरी तरह से गलत हैं कि "हाइबरनेट विशेष रूप से 2+ उत्सुक संघों पर शामिल होने वाले संभाल को संभाल नहीं सकता है"। यह पूरी तरह झूठा है। –

+0

आप "org.hibernate.loader.MultipleBagFetchException" को Google पर एक साथ नहीं ले सकते हैं: –

+0

बैग वास्तव में जेपीए द्वारा परिभाषित नहीं किए गए एक विशेष प्रकार के संग्रह हैं ... –

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