खोज…


आलसी लोडिंग बनाम ईगर लोडिंग

डेटा लाना या लोड करना मुख्य रूप से दो प्रकारों में वर्गीकृत किया जा सकता है: उत्सुक और आलसी।

हाइबरनेट का उपयोग करने के लिए सुनिश्चित करें कि आप इसका नवीनतम संस्करण अपनी pom.xml फ़ाइल की निर्भरता अनुभाग में जोड़ सकते हैं:

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-core</artifactId>   
    <version>5.2.1.Final</version>
</dependency>

1. उत्सुक लोड हो रहा है और आलसी लोड हो रहा है

पहली बात यह है कि हमें यहाँ चर्चा करनी चाहिए कि आलसी लोडिंग और उत्सुक लोडिंग क्या हैं:

ईगर लोडिंग एक डिज़ाइन पैटर्न है जिसमें डेटा आरंभीकरण मौके पर होता है। इसका मतलब यह है कि उनके माता-पिता के लाने के समय पूरी तरह से संग्रह किया जाता है (तुरंत प्राप्त करें)

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

2. लोडिंग के विभिन्न प्रकारों का उपयोग करना

निम्न XML पैरामीटर का उपयोग करके आलसी लोडिंग को सक्षम किया जा सकता है:

lazy="true"

चलिए उदाहरण में देते हैं। पहले हमारे पास एक उपयोगकर्ता वर्ग है:

public class User implements Serializable {
   
    private Long userId;
    private String userName;
    private String firstName;
    private String lastName;
    private Set<OrderDetail> orderDetail = new HashSet<>();

    //setters and getters
    //equals and hashcode
    }

हमारे पास जो ऑर्डर डाइटेल का सेट है, उसे देखें। अब आज्ञाचक्र वर्ग पर एक नजर डालते हैं:

public class OrderDetail implements Serializable {

    private Long orderId;
    private Date orderDate;
    private String orderDesc;
    private User user;

    //setters and getters
    //equals and hashcode
}

UserLazy.hbm.xml में आलसी लोडिंग सेट करने में शामिल होने वाला महत्वपूर्ण भाग:

<set name="orderDetail" table="USER_ORDER" inverse="true" lazy="true" fetch="select">
    <key>
        <column name="USER_ID" not-null="true" />
    </key>
   <one-to-many class="com.baeldung.hibernate.fetching.model.OrderDetail" />
</set>

इस तरह से आलसी लोडिंग सक्षम है। आलसी लोडिंग को अक्षम करने के लिए हम बस उपयोग कर सकते हैं: lazy = "false" और यह बदले में उत्सुक लोडिंग को सक्षम करेगा। निम्नलिखित एक अन्य फ़ाइल User.hbm.xml में उत्सुक लोडिंग स्थापित करने का उदाहरण है:

<set name="orderDetail" table="USER_ORDER" inverse="true" lazy="false" fetch="select">
    <key>
        <column name="USER_ID" not-null="true" />
    </key>
   <one-to-many class="com.baeldung.hibernate.fetching.model.OrderDetail" />
</set>

क्षेत्र

जो लोग इन दोनों डिजाइन के साथ नहीं खेला है के लिए, आलसी और उत्सुक के दायरे एक विशिष्ट SessionFactory के सत्र के भीतर है। उत्सुक सब कुछ तुरंत लोड करता है, इसका मतलब है कि इसे लाने के लिए कुछ भी कॉल करने की आवश्यकता नहीं है। लेकिन आलसी भ्रूण आमतौर पर मैप किए गए संग्रह / ऑब्जेक्ट को पुनः प्राप्त करने के लिए कुछ कार्रवाई की मांग करता है। यह कभी-कभी सत्र के बाहर आलसी होने में समस्याग्रस्त होता है। उदाहरण के लिए, आपके पास एक दृश्य है जो कुछ मैप किए गए पीओजेओ का विवरण दिखाता है।

@Entity
public class User {
    private int userId;
    private String username;
    @OneToMany
    private Set<Page> likedPage;

    // getters and setters here
}

@Entity
public class Page{
    private int pageId;
    private String pageURL;

    // getters and setters here
}

public class LazzyTest{
    public static void main(String...s){
        SessionFactory sessionFactory = new SessionFactory();
        Session session = sessionFactory.openSession();
        Transaction transaction = session.beginTransaction();
        
        User user = session.get(User.class, 1);
        transaction.commit();
        session.close();
        
        // here comes the lazy fetch issue
        user.getLikedPage();
    }
}

जब आप आलसी को सत्र के बाहर लाने की कोशिश करेंगे तो आपको lazyinitializeException मिल जाएगी । ऐसा इसलिए है क्योंकि सभी OneToMany या किसी अन्य संबंध के लिए डिफ़ॉल्ट रूप से प्राप्त की गई रणनीति आलसी (डिमांड पर कॉल) है और जब आपने सत्र बंद कर दिया है, तो आपके पास डेटाबेस के साथ संवाद करने की कोई शक्ति नहीं है। इसलिए हमारा कोड लाइकपेज का संग्रह लाने की कोशिश करता है और यह अपवाद को फेंक देता है क्योंकि डीबी प्रदान करने के लिए कोई संबद्ध सत्र नहीं है।

इसका उपयोग करने के लिए समाधान है:

  1. ओपन सेशन इन व्यू - जिसमें आप दिए गए व्यू पर भी सत्र को खुला रखते हैं।
  2. सत्र बंद करने से पहले Hibernate.initialize(user.getLikedPage()) - यह संग्रह तत्वों को आरंभ करने के लिए हाइबरनेट बताता है


Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow