2012-06-17 6 views
5

Hibernate documentation के अनुसार:क्यों एक से कई assococation में सरणी आलसी लोड नहीं हो सकता है?

को देख कि सरणियों आलसी नहीं किया जा सकता के बाद, आप निष्कर्ष निकाल सकते हैं कि सूचियों, नक्शे और idbags सबसे शक्तिशाली (गैर उलटा) संग्रह प्रकार

तो हैं मेरी प्रश्न मृत सरल है: एक से कई assococation में सरणी आलसी क्यों नहीं हो सकता है?

उत्तर

5

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

Arrays आलसी लोड नहीं हो सकते हैं क्योंकि हाइबरनेट को यह जानने का कोई तरीका नहीं होगा कि आप उन्हें पहली बार एक्सेस करने का प्रयास कर रहे हैं, क्योंकि आप "[]" ऑपरेटर (aaload बाइटकोड) को प्रॉक्सी नहीं कर सकते हैं, जब आप पहली बार इसे एक्सेस करने का प्रयास करते थे तो हाइबरनेट कभी नहीं जानता था, इसलिए यह इसे फ्लाई पर लोड नहीं कर पाएगा।

संग्रहों का उपयोग करते समय, आपको हमेशा उन्हें अपने तरीकों से एक्सेस करना होता है, इसलिए जब आप पहली बार उन्हें एक्सेस करने का प्रयास कर रहे हों तो उन्हें हाइबरनेट 100% सुनिश्चित कर सकते हैं और फिर उन्हें लोड कर सकते हैं।

तो, असली कारण यह है कि आपके कोड को सरणी एक्सेस ऑपरेटर को हुक करने का कोई तरीका नहीं है। फ़ील्ड के लिए आलसी लोडिंग पर भी ऐसा ही होता है, हाइबरनेट एक गैर-संग्रह संपत्ति को आलसी लोड नहीं कर सकता है, केवल फ़ील्ड तक पहुंचने के साथ ही यह नहीं पता होगा कि जब आप फ़ील्ड तक पहुंचने का प्रयास करते हैं, तो उन्हें हमेशा विधि पहुंच प्राप्त करने/सेट करने की आवश्यकता होती है।

यह कैसे किया जाता का एक उदाहरण के रूप में, आप, हाइबरनेट पर PersistentList संग्रह की जाँच यह indexOf विधि है (और कई अन्य) read विधि कहा जाता है पर कर सकते हैं:

public int indexOf(Object value) { 
    read(); 
    return list.indexOf(value); 
} 

और अंत read में विधि अभी संग्रह को प्रारंभ करती है अगर यह अभी तक आलसी लोड नहीं हुई है।

+0

आपके उत्तर के लिए बहुत बहुत धन्यवाद। पागल लगता है कि आप केवल ऐरे का उपयोग नहीं कर सकते क्योंकि हाइबरनेट सरणी एक्सेस ऑपरेटर को हुक नहीं कर सकता है। तो यह मूल रूप से जावा भाषा सीमा से आता है? – fabien7474

+1

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

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