2011-12-13 16 views
5

मेरे पास entity A है, जिसमें entity B से कई से अधिक संबंध हैं।हाइबरनेट, आलसी होना या आलसी होना नहीं?

तो तालिका लेआउट है: A, AB(mapping table), B

इकाई एक की एक वस्तु प्राप्त करने के लिए: मैं A.getById() जो करता है getHibernateTemplate().get(A.class, id) फोन वसंत का उपयोग कर और हाइबरनेट।

समस्या है, कभी कभी आगामी कोड एक बस की आवश्यकता होगी, कभी कभी आगामी कोड जुड़े बी के उपयोग करने के लिए जारी रहेगा, इसलिए हम कुछ मामलों में आलसी लोड हो रहा है और उत्सुक कुछ अन्य मामलों में उपयोग करना चाहते हैं। लेकिन समस्या यह है कि सभी डेटाबेस पहुंच एक ही ADao.java के माध्यम से प्रदान की जाती है, इसलिए केवल एक विधि getById() है।

क्या मुझे विधि getById() के दो संस्करण बनाना चाहिए?

लेकिन तब अधिक जटिल मामलों के लिए, अगर एक भी सी से जुड़ा हुआ है के माध्यम से कई-से-अनेक, तब वहाँ के वेरिएंट हो सकता है आलसी लोडिंग-सी और उत्सुक लोडिंग-सी है, तो आवश्यक getById() जल्दी वेरिएंट तेजी से बढ़ता है।

इस विकल्प पर आपकी राय क्या है?

धन्यवाद

उत्तर

3

सामान्य विचारों के लिए fetching strategies के बारे में हाइबरनेट 3.6 दस्तावेज़ों पर एक नज़र डालें। डिफ़ॉल्ट fetching रणनीति एनोटेशन मैपिंग या hbm.xml फ़ाइल में परिभाषित किया गया है। डिफ़ॉल्ट आलसी लोडिंग रणनीति से गतिशील रूप से एक उत्सुक लोडिंग रणनीति में स्विच करने के तीन तरीके हैं। पहले दो आलसी लोडिंग और उत्सुक लोडिंग उपयोग के मामलों के लिए डीएओ तरीकों में से अलग कार्यान्वयन की आवश्यकता होती है:

  1. एक हाइबरनेट मानदंड क्वेरी में Criteria.setFetchMode() एक HQL क्वेरी में
  2. FETCH कीवर्ड
  3. हाइबरनेट 3.5 (नहीं काफी के बाद से अब सुनिश्चित करें, शायद 3.6) fetch profiles का उपयोग करने का तीसरा विकल्प गतिशील रूप से आलसी लोडिंग से उत्सुक लोडिंग में स्विच करने के लिए है।

एक सत्र प्रोफ़ाइल पर एक fetch प्रोफ़ाइल सक्षम/अक्षम है। इसलिए, बशर्ते वांछित fetch प्रोफ़ाइल वर्तमान सत्र में सेट की गई हो, आप एक आलसी लोडिंग के लिए एक आलसी लोडिंग के लिए एक ही डीएओ विधि का उपयोग कर सकते हैं।

महत्वपूर्ण बात यहाँ के बारे में पता होना करने के लिए है कि आप केवल एक आलसी लोडिंग रणनीति एक उत्सुक लोडिंग रणनीति के लिए एनोटेशन में या एक hbm.xml फ़ाइल में परिभाषित से स्विच और इसके नहीं विपरीत कर सकते हैं। यह प्रतिबंध fetching रणनीति को स्विच करने के लिए उपयोग की जाने वाली विधि से स्वतंत्र है।

+0

FetchProfile बहुत अच्छा है। क्या अद्यतन के लिए समकक्ष है? – Tadhg

3

ठीक है, आप समस्या को सही ढंग से वर्णन किया। यह सादगी (केवल एक विधि) और प्रदर्शन (दो विधियों, प्रत्येक जो वास्तव में आवश्यक है) के बीच सिर्फ एक व्यापार है। यदि प्रतिक्रिया समय केवल एक विधि और आलसी लोडिंग बीएस का उपयोग करके सही है, तो कुछ भी स्पर्श न करें। यदि प्रतिक्रिया समय बहुत लंबा है, और आपने माप लिया है कि उत्सुक लोडिंग यह सही करेगी, फिर एक नई विधि पेश करें।

चीजों को सरल रखें, और केवल तभी अनुकूलित करें जब आवश्यक हो। आलसी लोडिंग एसोसिएशन तेजी से है, क्योंकि यह सिर्फ एक विदेशी कुंजी पर एक क्वेरी बनाते हैं, whcih डेटाबेस में अनुक्रमित किया जाना चाहिए।

यह भी नहीं कि दो से अधिक संघों को लोड करना बहुत दुर्लभ है: किसी पृष्ठ पर किसी श्रेणी के सभी उत्पादों को दिखाने के लिए आम बात है, लेकिन यह किसी श्रेणी के सभी उत्पादों के सभी हिस्सों को दिखाने के लिए असामान्य है।

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