2012-01-23 9 views
5

मैं लिंक हाइबरनेट के लिए रणनीति लाने net.One संक्षिप्त और संक्षिप्त लिंक पर मैं इसे पसंद किया में से कुछ के माध्यम से चले गए हैं http://www.mkyong.com/hibernate/hibernate-fetching-strategies-examples/ है। हमारे पास चार प्रकार की fetch रणनीतियों है। ये हैं: -fetchmode के साथ fetchtype के हाइबरनेट और संबंध में लाने की रणनीतियों के बारे में कुछ सवाल?

  1. fetch- "join" = आलसी लोडिंग को अक्षम करें, हमेशा सभी संग्रह और इकाइयों को लोड करें।
  2. fetch- "चयन करें" (डिफ़ॉल्ट) = सभी संग्रह और संस्थाओं को आलसी लोड करें।
  3. बैच आकार = "एन" = 'एन' संग्रह या संस्थाओं के लिए ऊपर ला रहा है, रिकॉर्ड नहीं है।
  4. fetch- "उप-चयन" = अपने संग्रह को उप-चयन कथन में समूहित करें।

मेरा पहला सवाल जो ऊपर से एक उत्सुक या lazyloading लाने प्रकार के लिए योग्य नहीं रहा?

जैसे ही मैं के रूप में उत्सुक है, मैं केवल के साथ छोड़ दिया हूँ शामिल होने लाने fetchtype उल्लेख मेरे प्रश्नों को बढ़ाने के लिए के बारे में हाइबरनेट मेरी विभाग वर्ग

@OneToMany(mappedBy = "department", cascade = CascadeType.ALL, fetch = FetchType.EAGER,  orphanRemoval = true) 
@Fetch(value = FetchMode.SELECT) 
@BatchSize(size = 10) 
private Set<EmployeeData> employees = new HashSet<EmployeeData>(); 

मेरी समझ के अनुसार में रणनीतियों कोड स्निपेट नीचे मैं विचार कर रहा हूँ लाने रणनीति लेकिन जब मैं lazyloading के रूप में fetchtype के रूप में उल्लेख करते हैं, तो मेरे पास अन्य तीन विकल्प यानी चयन, बैच आकार और उप-चयन है। सहमत हुए? अब यदि मैं एक मेरी विरासत परियोजना में कोड स्निपेट देखता हूं, तो उसने फेयर प्रकार को उत्सुक और लाने की रणनीति के रूप में वर्णित किया है जो कि एक-दूसरे से विरोधाभासी है। सही?

एक और प्रश्न है जब मैं FetchMode लिखता हूं तो मुझे बैच-आकार विकल्प दिखाई नहीं देता है। और नियंत्रण + अंतरिक्ष ग्रहण में अंतरिक्ष हालांकि मैं अन्य तीन fetch रणनीतियों को देखते हैं?

उत्तर

16

हाइबरनेट संग्रह में प्रकार और fetch मोड सेटिंग्स प्राप्त होती है।

लायें प्रकार निर्दिष्ट जब संग्रह का तत्वों प्राप्त किए गए हैं, और लाने मोड निर्दिष्ट करता कैसे हाइबरनेट उन्हें प्राप्त करता है।

तो, FetchMode.SELECT और FetchMode.SUBSELECTFetchType.EAGER और FetchType.LAZY दोनों के साथ कानूनी हैं। अंतर यह है कि FetchType.EAGER के साथ एक अतिरिक्त चयन क्वेरी तुरंत निष्पादित की जाती है, जबकि FetchType.LAZY के साथ संग्रह के पहले पहुंच के बाद इसे निष्पादित किया जाता है।

FetchMode.JOIN, तथापि, FetchType.LAZY साथ मतलब नहीं है।

बैच आकार FetchMode.SELECT के लिए एक अतिरिक्त अनुकूलन है, ताकि इसे अपनी एनोटेशन (@BatchSize) द्वारा कॉन्फ़िगर किया जाना चाहिए और FetchMode गणना के साथ कुछ भी नहीं करना चाहिए।

यह भी देखें:

+0

कमाल और त्वरित स्पष्टीकरण –

+0

+1 शानदार उत्तर –

0

बैच आकार = एनके लगभग बराबर है लाने = सबसिलेक्ट

मान लीजिए आप 10000 माता पिता रिकॉर्ड है और उनमें से हर एक में 500 बच्चे रिकॉर्ड है, और अगर आप सबसिलेक्ट के रूप में प्राप्त कर रहा है रणनीति का उपयोग तो यह प्रश्नों कैसा दिखेगा कैसे: कैसे तो यह करता है मुझे आप के बारे में बताएं:

उपखंड:
* माता-पिता से चुनें;
* बच्चे से चुनें जहां बच्चे। माता-पिता में (माता-पिता से Parent_Id का चयन करें)।

नोट: अगर स्थिति में अंतर्निहित डेटा बेस द्वारा प्रदान की गई सीमा से अधिक है, तो स्पष्ट रूप से उपर्युक्त क्वेरी विफल हो जाती है। यहां ऐसी स्थिति है जहां बैच-आकार चित्र में आ रहा है। बैच-आकार का उपयोग करके हम IN खंड में भाग लेने के लिए Parent_Id की संख्या का उल्लेख कर सकते हैं।

& करें बैच आकार:
माता पिता से * का चयन करें;
* बच्चे से बच्चे का चयन करें। माता-पिता में (1,2,3,4 ...... अंतर्निहित डीबी की धारा सीमा तक)।
* बच्चे से बच्चे का चयन करें। माता-पिता में (1001,1002 ...... अंतर्निहित डीबी की इन धारा सीमा तक)।

नोट: बैच आकारसाथ किया जाना चाहिए लाने = का चयन करें, लेकिन साथ नहीं लाने = सबसिलेक्ट (क्योंकि यह कोई मतलब नहीं है)।

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