हाइबरनेट में एक-से-एक, कई-से-एक और एक-से-कई के लिए डिफ़ॉल्ट फ़ेच प्रकार


103

हाइबरनेट मैपिंग में डिफ़ॉल्ट भ्रूण प्रकार क्या है?

खोज के बाद मुझे क्या पता चला है:

  • एक-से-एक के लिए यह उत्सुक है
  • एक-से-कई के लिए यह आलसी है

लेकिन ग्रहण में इसका परीक्षण करने के बाद, यह सभी के लिए उत्सुक था।

क्या यह इस बात पर निर्भर करता है कि मैं जेपीए या हाइबरनेट का उपयोग कर रहा हूं?


1
यदि आप अभी भी जेपीए विषयों में शामिल हैं - मैंने आपके प्रश्न को एक नए उत्तर के साथ अपडेट किया है, क्योंकि पुराने पुराने हाइबरनेट संस्करण के लिए पुराने हैं।
अलेक्जेंडर रूह

जवाबों:


193

यह इस बात पर निर्भर करता है कि आप JPA या हाइबरनेट का उपयोग कर रहे हैं।

से जेपीए 2.0 कल्पना , चूक कर रहे हैं:

OneToMany: LAZY
ManyToOne: EAGER
ManyToMany: LAZY
OneToOne: EAGER

और हाइबरनेट में, सभी आलसी है

अपडेट करें:

हाइबरनेट का नवीनतम संस्करण उपरोक्त जेपीए चूक के साथ संरेखित है।


11
"और हाइबरनेट में, सभी आलसी है" जाहिरा तौर पर यह हाल के संस्करणों में बदल गया है। कृपया अलेक्जेंडर रूहल का जवाब नीचे देखें
दीनी

1
हाइबरनेट JPA कार्यान्वयन में से एक है, इसलिए एक बार जब आप हाइबरनेट का उपयोग कर रहे हैं, तो आप JPA का उपयोग कर रहे हैं :)
xenteros

यह एक लोकप्रिय क्वेरी है। @ आशीष अग्रवाल क्या आप अपने उत्तर की अंतिम पंक्ति को अपडेट कर सकते हैं। हाइबरनेट में अब सभी के लिए आलसी नहीं है।
सौरभ तिवारी

नवीनतम हाइबरनेट व्यवहार के संबंध में पोस्ट को अपडेट किया।
एम अनौटी

एक अद्यतन था, यह दावा करते हुए कि उत्सुक हर मानचित्रण के लिए डिफ़ॉल्ट प्रकार का है, जो वर्तमान 5.x और नए 6.x हाइबरनेट दस्तावेज़ में अध्याय 11.3 द्वारा रिबेट किया गया है, इसलिए मैं संपादन को समाप्त कर देता हूं। इसके अलावा, यह स्वत: उत्सुकता नहीं होने की सिफारिश के खिलाफ है, क्योंकि इसका मतलब यह होगा कि किसी एकल ऑब्जेक्ट को लाने के दौरान संभवतः पूरे डेटाबेस का चयन करें।
अलेक्जेंडर रूहल

51

मुझे पता है कि सवाल पूछने के समय उत्तर सही थे - लेकिन चूंकि लोग (इस मिनट मेरे जैसे) अभी भी उन्हें यह सोचकर ढूंढते हैं कि उनका वाइल्डली 10 अलग तरह से व्यवहार क्यों कर रहा था, मैं वर्तमान हाइबरनेट 5 के लिए एक अपडेट देना चाहूंगा। .x संस्करण:

में हाइबरनेट 5.2 उपयोगकर्ता मार्गदर्शिका यह अध्याय में कहा गया है 11.2। लाने की रणनीति :

हाइबरनेट अनुशंसा सभी संघों को आलसी रूप से चिह्नित करने और उत्सुकता के लिए गतिशील लाने की रणनीतियों का उपयोग करने के लिए है। यह दुर्भाग्य से जेपीए विनिर्देश के साथ बाधाओं पर है जो परिभाषित करता है कि सभी एक-से-एक और कई-से-एक संघों को डिफ़ॉल्ट रूप से उत्सुकता से प्राप्त किया जाना चाहिए । JPA प्रदाता के रूप में हाइबरनेट, उस डिफ़ॉल्ट को सम्मानित करता है।

इसलिए हाइबरनेट के साथ-साथ आशीष अग्रवाल जैसा बर्ताव करते हैं जैसा कि जेपीए के लिए ऊपर कहा गया है:

OneToMany: LAZY
ManyToOne: EAGER
ManyToMany: LAZY
OneToOne: EAGER

(देखें जेपीए 2.1 कल्पना )


और क्या होगा यदि हम JPA के बजाय देशी हाइबरनेट का उपयोग करते हैं, तो क्या यह उसी तरह से काम करता है?
jMounir

@jMounir: ठीक है, मैंने वह कोशिश नहीं की है, लेकिन चूंकि हाइबरनेट बताता है कि यह जेपीए में परिभाषित की तरह व्यवहार करता है, इसलिए मैं यह नहीं देखता कि हाइबरनेट का उपयोग करते समय यह अलग क्यों होगा। दोनों मामलों में एक डिफ़ॉल्ट रणनीति को ओवरराइड कर सकता है।
अलेक्जेंडर रूहल

15

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

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

इसलिए हाइबरनेट हमेशा एक आलसी लाने की रणनीति का उपयोग करके किसी भी वस्तु को लोड करेगा, चाहे आप किसी भी प्रकार का संबंध घोषित कर चुके हों। यह एक एकल-से-एक या कई-से-एक संबंध में एक ही वस्तु के लिए एक आलसी प्रॉक्सी (जो एकरहित होना चाहिए, लेकिन अशक्त नहीं होना चाहिए) का उपयोग करेगा और एक शून्य संग्रह जिसे आप इसे एक्सेस करने का प्रयास करते समय मूल्यों के साथ हाइड्रेट करेंगे। ।

यह समझा जाना चाहिए कि हाइबरनेट केवल इन वस्तुओं को मूल्यों से भरने का प्रयास करेगा जब आप ऑब्जेक्ट तक पहुंचने का प्रयास करते हैं, जब तक कि आप निर्दिष्ट नहीं करते fetchType.EAGER


0

एकल मूल्यवान संघों के लिए, यानी एक-से-एक और कई-से-एक: -
डिफ़ॉल्ट आलसी = प्रॉक्सी
प्रॉक्सी आलसी लोडिंग : - इसका तात्पर्य है कि आपकी संबद्ध इकाई का प्रॉक्सी ऑब्जेक्ट लोड है। इसका मतलब यह है कि संबंधित इकाई के प्रॉक्सी ऑब्जेक्ट के लिए केवल दो संस्थाओं को जोड़ने वाली आईडी लोड की गई है।
जैसे: A और B दो संस्थाएँ हैं जिनमें बहुत से एक से जुड़े हुए हैं। यानी: प्रत्येक बी के लिए कई ए हो सकते हैं। ए के प्रत्येक ऑब्जेक्ट में बी
` का संदर्भ होगा

public class A{
    int aid;
    //some other A parameters;
    B b;
}
public class B{
    int bid;
     //some other B parameters;
}

`
संबंध ए में कॉलम (सहायता, बोली, ... इकाई ए के अन्य कॉलम) होंगे।
संबंध B में कॉलम होंगे (बोली, ... इकाई B के अन्य कॉलम)

प्रॉक्सी का अर्थ है जब A को लिया जाता है, केवल B को B के लिए लाया जाता है और B के प्रॉक्सी ऑब्जेक्ट में संग्रहीत किया जाता है जिसमें केवल आईडी होता है। बी का प्रॉक्सी ऑब्जेक्ट एक प्रॉक्सी-क्लास का ऑब्जेक्ट है जो केवल न्यूनतम फ़ील्ड के साथ बी का एक उपवर्ग है। चूंकि बोली पहले से ही संबंध A का हिस्सा है, इसलिए संबंध से बोली प्राप्त करने के लिए किसी क्वेरी को फायर करना आवश्यक नहीं है। B की अन्य विशेषताएँ बी को केवल तभी लोड किया जाता है जब बोली के अलावा कोई अन्य फ़ील्ड एक्सेस की जाती है।

संग्रह के लिए, यानी कई-से-कई और एक-से-कई: -
डिफ़ॉल्ट आलसी = सत्य


कृपया यह भी ध्यान दें कि भ्रूण की रणनीति (चयन, शामिल आदि) आलसी को ओवरराइड कर सकती है। यानी: यदि आलसी = 'सच्चा' और 'भ्रूण' = 'जुड़ना' है, तो A का लाने पर B या Bs भी आएगा (संग्रह के मामले में)। यदि आप इसके बारे में सोचते हैं तो आपको इसका कारण मिल सकता है।
एकल मूल्यवान एसोसिएशन के लिए डिफॉल्ट "ज्वाइन" है।
संग्रह के लिए डिफ़ॉल्ट फ़ेच "चयन" है। कृपया अंतिम दो पंक्तियों को सत्यापित करें। मैंने वह तार्किक रूप से घटा दिया है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.