2013-06-26 7 views
14

मुझे सत्र के बाहर आलसी लोड ऑब्जेक्ट्स/कॉललेशन का उपयोग करना है, हम Hibernate.initialize(Object obj) करते हैं ताकि प्रारंभिक() विधि को तर्क के रूप में पारित किया गया ऑब्जेक्ट प्रारंभ किया जा सके और इसका दायरा के बाहर उपयोग किया जा सके अधिवेशन ।कैसे Hibernate.initialize() काम करता है

लेकिन मैं यह समझने में सक्षम नहीं हूं कि यह कैसे काम करता है। मेरा मतलब है कि अगर हम कर रहे हैं तो हम उत्सुक होने में खत्म हो जाते हैं, इसलिए हमने कॉन्फ़िगरेशन में आलसी क्यों किया और रनटाइम के दौरान उत्सुकता में समाप्त हो गया।

दूसरे शब्दों में, मैं Hibernate.initialize() और eagerly उस ऑब्जेक्ट को लोड करने के बीच अंतर जानना चाहता हूं।

क्या मुझे यह गलत लगता है या कुछ याद आती है?

उत्तर

27

अंतर आवेदन के दायरे में है।

संग्रह एसोसिएशन आलसी बनाने का कारण यह है कि यदि आपको वास्तव में इसकी आवश्यकता नहीं होती है तो हर बार अभिभावक वस्तु लोड होने पर संग्रह को लोड करने से बचें।

यदि आप आम तौर पर एक संग्रह को आलसी लोड कर रहे हैं, लेकिन किसी विशेष उपयोग के लिए, आपको यह सुनिश्चित करना होगा कि सत्र बंद होने से पहले संग्रह लोड हो गया है, तो आप Hibernate.initialize(Object obj) का उपयोग कर सकते हैं जैसा आपने नोट किया था।

यदि आप वास्तव में हमेशा संग्रहित लोड की आवश्यकता है, तो आपको वास्तव में इसे उत्सुकता से लोड करना चाहिए। हालांकि अधिकांश सॉफ्टवेयर में, यह मामला नहीं है।

2

@Don रूबी का जवाब पर विचार करें

अगले अंतर यह है कि Hibernate.initialize उत्पन्न करता है और डेटा प्राप्त करने में के लिए अतिरिक्त एसक्यूएल निष्पादित करता है। तो सत्र बंद होने के बाद आप इसका उपयोग कर सकते हैं। जब आप Eager इकाई में लाने का उपयोग करते हैं तो यह डेटाबेस में डेटा कनेक्शन (कनेक्शन सत्र के तहत) खोजने के दौरान हमेशा उस संग्रह को प्राप्त करता है, लेकिन इसके बाद नहीं।

1

असल में यदि आप ईगर का उपयोग करते हैं, तो जब आपके पास बड़े संग्रह होते हैं तो यह वास्तव में आपके प्रदर्शन को प्रभावित करता है। तो, Hibernate.initialize का उपयोग कर इस तरह की स्थितियों में यह एक अच्छा विचार है। निम्न उदाहरण Hibernate Lazy Fetch vs Eager Fetch Type

+1

यदि आपके पास ऐसा संग्रह है जो सत्र के बाहर पहुंच जाएगा और आप केवल Hibernate.in प्रारंभ करेंगे, तो आपको सदस्य तक पहुंचने पर एक अच्छा LazyInitializationException मिलेगा। –

4

पर विचार करें::

इस पर एक नजर डालें

मैं एक इकाई LoanApplication (जो इस मामले में एक बहुत भारी वस्तु है), जो इसके अंदर विभिन्न क्षेत्रों है (जो भी बड़ा हो सकता है)। उदाहरण के लिए ऋण आवेदन में SubLoan क्षेत्र पर विचार करें।

@OneToMany(fetch = FetchType.LAZY) 
@JoinColumn(name = "application_fk") 
@Index(name = "appl_fk_idx_subloansLoanApp") 
private Set<SubLoan> subLoans; 

FetchType इस उदाहरण में LAZY है। अब अगर कुछ संचालन करते समय कुछ नियंत्रक की विधि में, आपको ऋण आवेदन मिलता है, तो उप-समूह सेट प्रारंभ में तब तक शून्य हो जाएगा जब तक आप इसका उपयोग नहीं करना चाहते। उस मामले में आप निम्नलिखित की तरह Hibernate.initialize का उपयोग करें:

Hibernate.initialize(loanApplication.getSubLoans()); 

इसका कारण यह है हर बार जब आप LoanApplication, वस्तुओं के बड़े सेट उदाहरण के लिए 'subLoan' पुनः प्राप्त शुरू में खाली जब तक आप वास्तव में उन्हें चाहता था हो जाएगा मुख्य रूप से प्रदर्शन में सुधार करने में मदद करता है।

0

मान लें कि आपके पास एक टेबल है जिसमें अन्य 4 टेबल के साथ संबंध हो सकते हैं। इस मामले में यदि आप उत्सुकता से उपयोग करते हैं, तो सभी चार संबंधित तालिकाओं के सभी संबंधित संबंध प्रत्येक fetch ऑपरेशन में लाए जाएंगे।

लेकिन मान लीजिए कि आपको ऐसी आवश्यकता हो सकती है जिसमें आपको संबंधित तालिकाओं के बीच केवल एक तालिका से डेटा की आवश्यकता हो, इसलिए इस मामले में आप केवल चार संबंधित तालिका के डेटा को लदान करने के बजाय आवश्यक संबंध प्राप्त कर सकते हैं Hibernate.in सुविधा का आरंभ करें।

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