2.1 लाने का विकल्प
हाइबरनेट के डेवलपर्स लंबे समय से बाल संस्थाओं को लोड करने की समस्या के बारे में जानते हैं। इसलिए उन्होंने जो पहला काम किया, वह एनोटेशन में एक विशेष फ़ेच पैरामीटर जोड़ना@OneToMany
था ।@ManyToMany
यह पैरामीटर दो मान ले सकता है:
- आतुर
- आलसी
उदाहरण:
@OneToMany(fetch = FetchType.LAZY, mappedBy = "user")
यदि फ़ेच पैरामीटर ईएजीईआर के बराबर है , तो मूल इकाई लोड होने पर, इसकी सभी चाइल्ड इकाइयां भी लोड हो जाएंगी। साथ ही, हाइबरनेट इसे एक SQL क्वेरी में करने का प्रयास करेगा, एक भारी क्वेरी उत्पन्न करेगा और एक ही बार में सभी डेटा प्राप्त करेगा।
यदि फ़ेच पैरामीटर LAZY मान लेता है , तो मूल इकाई लोड होने पर, चाइल्ड इकाई लोड नहीं होगी। इसके बजाय, एक प्रॉक्सी ऑब्जेक्ट बनाया जाएगा।
इस प्रॉक्सी ऑब्जेक्ट की मदद से, हाइबरनेट इस चाइल्ड एंटिटी तक पहुंच को ट्रैक करेगा और इसे पहली बार एक्सेस करने पर मेमोरी में लोड करेगा।
अगर हम टिप्पणियों के साथ अपनी स्थिति को याद करते हैं:
@Entity
@Table(name="user")
class User {
@Column(name="id")
public Integer id;
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinColumn(name = "user_id")
public List<Comment> comments;
}
फिर आपके पास "ठाठ पसंद" है:
यदि fetch = FetchType.EAGER
, तो हाइबरनेट कोड की पहली पंक्ति पर सभी टिप्पणियों को लोड करेगा:
User user = session.get(User.class, 1); //load all comments here
List<Comment> comments = user.getComments();
यदि fetch = FetchType.LAZY
, तो हाइबरनेट कोड की दूसरी पंक्ति पर सभी टिप्पणियों को लोड करेगा:
User user = session.get(User.class, 1);
List<Comment> comments = user.getComments(); //load all comments here
जैसा कि आप पहले ही अनुमान लगा सकते हैं, आपके पास कोई विकल्प नहीं है जब यह सभी टिप्पणियों को लोड नहीं करता :)
2.2 डिफ़ॉल्ट मान
यदि आप ... एनोटेशन के लिए एक लाने का विकल्प निर्दिष्ट नहीं करते हैं @ManyTo
, तो हाइबरनेट डिफ़ॉल्ट मानों का उपयोग करेगा।
वे अलग-अलग एनोटेशन प्रकारों के लिए थोड़े अलग हैं। एनोटेशन के लिए @OneToOne
और @ManyToOne
उत्सुक है, एनोटेशन के लिए @OneToMany
और @ManyToMany
आलसी है। यह याद रखना आसान है - यदि हम किसी एक वस्तु का उल्लेख करते हैं, तो वह पूरी तरह से लोड हो जाएगी। अगर हम एक संग्रह का संदर्भ देते हैं, तो इसे पहली बार एक्सेस करने पर लोड किया जाएगा।
2.3 @LazyCollection एनोटेशन
जैसा कि आप पहले ही देख चुके हैं, संग्रह के साथ काम करते समय फ़ेच पैरामीटर ज़्यादा मदद नहीं करता है। हाइबरनेट के रचनाकारों ने एक विशेष एनोटेशन जोड़कर इसे ठीक करने का प्रयास किया @LazyCollection
। यह आमतौर पर इस तरह लिखा जाता है:
@LazyCollection(LazyCollectionOption.TRUE)
संग्रह फ़ील्ड मैप करते समय आपको इसे निर्दिष्ट करने की आवश्यकता है:
@Entity
@Table(name="user")
class User {
@Column(name="id")
public Integer id;
@OneToMany(cascade = CascadeType.ALL)
@LazyCollection(LazyCollectionOption.TRUE)
public List<Comment> comments;
}
इस एनोटेशन में एक मान पैरामीटर है जो तीन मानों में से एक ले सकता है:
- LazyCollectionOption. सत्य
- LazyCollectionOption. असत्य
- LazyCollectionOption. अतिरिक्त
पहले दो विकल्प काफी हद तक लाने के विकल्प के समान हैं।
यदि पैरामीटर सेट किया गया है , तो इसका मतलब है कि मूल उपयोगकर्ता ऑब्जेक्ट लोड होने पर LazyCollectionOption.TRUE
टिप्पणी फ़ील्ड के मान डेटाबेस से लोड नहीं किए जाएंगे । टिप्पणी प्रकार के ऑब्जेक्ट पहली बार टिप्पणी फ़ील्ड तक पहुंचने पर लोड किए जाएंगे। वास्तव में, यह पैरामीटर के बराबर हैFetchType.LAZY
यदि पैरामीटर सेट किया गया है , तो इसका मतलब है कि मूल उपयोगकर्ता ऑब्जेक्ट लोड करते समय LazyCollectionOption.FALSE
टिप्पणी फ़ील्ड के मान डेटाबेस से लोड किए जाएंगे । टिप्पणी प्रकार के ऑब्जेक्ट पहली बार टिप्पणी फ़ील्ड तक पहुंचने पर लोड किए जाएंगे। वास्तव में, यह के बराबर है FetchType.EAGER
।
GO TO FULL VERSION