2012-01-23 21 views
14

मैं हाइबरनेट कॉलबैक विधि का उपयोग करने के फायदे समझने में सक्षम नहीं हूं, क्या कोई फायदे या विशिष्ट उपयोग केस है जहां हमें इसके लिए जाना चाहिए।हाइबरनेट कॉलबैक का उपयोग करने के लाभ?

public List findRecentRequests(final int offset, final int length) 
{ 
    List list = getHibernateTemplate().executeFind(new HibernateCallback() 
    { 
     public Object doInHibernate(Session session) throws HibernateException 
     { 
      Query q = session.createQuery(FIND_RECENT_REQUESTS); 
      q.setFirstResult(offset); 
      q.setMaxResults(length); 
      return q.list(); 
     } 
    }); 
    return list; 
} 

यह भी एक और महत्वपूर्ण सवाल यह है कि क्वेरी रिटर्न मूल्यों के बाद हर बार HibernateCallback विधि बंद सत्र करता है? मैंने केस का उपयोग किया है जहां स्टेटस पेज के प्रत्येक रीफ्रेश पर इस फ़ंक्शन को कई बार कॉल किया जा रहा है और इसलिए यह हर बार खुले सत्र और क्वेरी डेटाबेस होगा या फिर यह क्वेरी परिणामों को स्मृति में संग्रहीत करेगा और फिर जब भी मैं इस फ़ंक्शन पर कॉल करता हूं, परिणाम निकाल दिए जाएंगे याद से।

मैंने पढ़ लिया है (Reference):

वसंत HibernateTemplate.execute() डिफ़ॉल्ट रूप से पूरा होने पर किसी भी खुले सत्र बंद कर देता है। कोई सत्र

प्रासंगिक दस्तावेज भाग का कोई भी संदर्भ अत्यधिक सराहना की है - प्रॉक्सी सक्रिय नहीं कर सका: जब आलसी आरंभीकरण के साथ प्रयोग किया आप निम्नलिखित

org.hibernate.LazyInitializationException की तरह एक LazyInitializationException मिल सकता है।

अद्यतन:

मेरे मामले में EJB लेनदेन का उपयोग कर रहा है और यह सेटिंग "समर्थन" करने के लिए और मैं उस मामले के रूप में इस सौदे का समर्थन करने के लिए सेट कर दिया जाता में विश्वास करते हैं, यह वैकल्पिक है और इसलिए हर नया सत्र बनाया जाएगा और हाइबरनेट परिणाम प्राप्त करने के लिए डेटाबेस से पूछताछ करेगा और इसलिए मुझे बाधाएं आ रही हैं, क्या यह सही धारणाएं बनाने के लिए होगी?

+0

आप अपने डेटा एक्सेस लेयर से वापस आने से पहले आलसी संग्रह शुरू करना चाहते हैं जहां सत्र खुला है। या 'OpenSessionInViewFilter' – millimoose

+0

@Inerdial का उपयोग करें: यदि आप एक उदाहरण के साथ अधिक विस्तृत कर सकते हैं तो मैं वास्तव में सराहना करता हूं? – Rachel

+0

हाइबरनेट डॉक्स [प्रारंभिक संग्रह और प्रॉक्सी] के साथ सौदा करते हैं (http://docs.jboss.org/hibernate/core/4.0/manual/en-US/html/performance.html#performance-fetching-initialization) पहले से ही। वसंत ["व्यू फ़िल्टर में ओपन सत्र"] का कार्यान्वयन भी प्रदान करता है (http://static.springsource.org/spring/docs/3.1.x/javadoc-api/org/springframework/orm/hibernate4/support/OpenSessionInViewFilter .html) हाइबरनेट दस्तावेज़ों द्वारा उल्लिखित। विस्तृत जानकारी के लिए – millimoose

उत्तर

18

HibernateCallback का उपयोग करने के बारे में आपके बिंदु पर। संक्षिप्त उत्तर - यह आपको अधिक जटिल हाइबरनेट कार्यों को करने के लिए वर्तमान लेनदेनबद्ध सत्र तक पहुंचने की अनुमति देता है। अधिकांश समय HibernateTemplate पर सरल विधियां पर्याप्त हैं, लेकिन कभी-कभी आपको Session पर जाने की आवश्यकता होती है।

पहेली में दो भाग हैं।

पहला लेनदेन क्षेत्र है जिसे PlatformTransactionManager/TransactionTemplate या @Transactional एनोटेशन का उपयोग करके परिभाषित किया गया है। अधिक जानकारी के लिए वसंत दस्तावेज़/गूगल देखें।

दूसरी बात यह है कि जब आप एक लेनदेन के भीतर होते हैं HibernateTemplate कुछ जादू का उपयोग कर वर्तमान लेनदेन के साथ बातचीत करेगा।

तो hibernateTemplate.save() जैसे एक साधारण ऑपरेशन लेनदेन में भाग लेंगे। आपके उदाहरण की तरह एक और जटिल लेनदेन में भी भाग लेगा। वास्तव में एचटीम्प्लेट पर बहुत अधिक विधि भाग लेगी।

तो जब सत्र प्राप्त करना बंद कर दिया

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

ऊपर दिए गए दूसरे मामले में ध्यान देने योग्य एक महत्वपूर्ण बिंदु कोई स्पष्ट लेनदेन नहीं है। आप कनेक्शन के ऑटो-प्रतिबद्ध मोड की दया पर हैं ताकि आप कॉलबैक में, सेव, सेव, अपवाद फेंक सकें। पहली बचत मई को किया गया है, लेनदेन के बिना कोई गारंटी नहीं है।

मेरी सलाह, जब कोई अपडेट कर रहा है, तो लेनदेन का उपयोग करें।

यदि लेनदेन अध्याय के लिए वसंत दस्तावेज़ों की जांच करने के लिए सभी लेनदेन सामग्री नई है।

+0

+1। – Rachel

+0

मेरे मामले में ईजेबी लेनदेन का उपयोग कर रहा है और इसे "समर्थन" पर सेट कर रहा है और मैं उस मामले में विश्वास करता हूं क्योंकि लेनदेन का समर्थन करने के लिए सेट किया गया है, यह वैकल्पिक है और इसलिए हर बार नया सत्र बनाया जाएगा और हाइबरनेट परिणाम प्राप्त करने के लिए डेटाबेस से पूछेगा और इसलिए मुझे बाधा आ रही है, क्या यह सही धारणाएं बनाने के लिए होगी? – Rachel

+0

क्षमा करें मैं बाधाओं के बारे में आपके प्रश्न का पालन नहीं कर रहा हूं, क्या आप फिर से बदल सकते हैं? –

6

यदि आप वसंत का उपयोग कर रहे हैं, तो आपको इस पारदर्शी तरीके से निपटने के लिए अपने रिपोजिटरी या सेवा परत के आस-पास declarative transaction management का उपयोग करना चाहिए। PlatformTransactionManager कार्यान्वयन जो भी दिया गया दृढ़ता प्रदाता के लिए उपयुक्त होगा।

यह डेटा एक्सेस कोड से बाहर होने के बाद आलसी संग्रहों पर भरोसा करने के लिए बुरी आदत माना जाता है - इसका आमतौर पर मतलब है कि आपके पास अपने ऐप के नियंत्रक/दृश्य परतों में कुछ व्यावसायिक तर्क है जिसे इसे स्थानांतरित किया जाना चाहिए सेवा परत

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