4.1 लेन-देन और डेटाबेस अखंडता

डेटाबेस के संचालन का सामान्य तरीका तब होता है जब इसे सैकड़ों अलग-अलग ग्राहकों से हर मिनट हजारों अनुरोध प्राप्त होते हैं। इस मामले में, अक्सर ऐसी स्थितियाँ उत्पन्न होती हैं जब एक ही डेटा को विभिन्न प्रश्नों से एक्सेस किया जाता है।

कम अक्सर, लेकिन, फिर से, समय-समय पर ऐसी परिस्थितियां होती हैं जब एक अनुरोध एक निश्चित पंक्ति को पढ़ता है, और दूसरा अनुरोध उसी समय इसे बदल देता है। कल्पना कीजिए कि अगर कोई एक पंक्ति पढ़ता है जो केवल आधा बदला हुआ है तो क्या होगा? कुछ भी अच्छा नहीं।

यह समस्या कई तरह से हल हो जाती है। सबसे पहले, आप बस उस लाइन को लॉक कर सकते हैं जो बदलती है। पढ़ने और लिखने दोनों के लिए। यह विधि काम करती है, लेकिन आधार की गति को बहुत नुकसान होता है।

दूसरा तरीका स्ट्रिंग को केवल लिखने के लिए लॉक करना है। हालाँकि, तब भी समस्या होगी जब कोई व्यक्ति आंशिक रूप से संशोधित रेखा को पढ़ने का प्रयास करेगा। निष्कर्ष - ऐसी स्थिति नहीं होनी चाहिए जब लाइन आंशिक रूप से बदली गई हो।

इसलिए, वे एक तीसरी विधि - लेन-देन के साथ आए। एक लेन-देन क्रियाओं का एक समूह है जो या तो सभी एक साथ किया जाता है, या कोई भी नहीं। ऐसी स्थिति नहीं हो सकती है जहां कार्रवाई का हिस्सा किया गया हो और दूसरा हिस्सा नहीं किया गया हो। यदि सभी परिवर्तन करना संभव नहीं है, तो पहले से किए गए सभी परिवर्तन वापस ले लिए जाते हैं।

कोई भी आधुनिक SQL सर्वर आपको केवल लेन-देन में डेटा बदलने की अनुमति देता है। आप एक लेन-देन खोलते हैं, किसी भी तालिका में कोई भी परिवर्तन करते हैं, और लेन-देन करते हैं। SQL सर्वर तब परिवर्तन करने का प्रयास करता है। यदि सब कुछ ठीक रहा, तो उन्हें सामान्य डेटाबेस में जोड़ दिया जाएगा। यदि समस्याएँ थीं, तो सभी परिवर्तन रद्द कर दिए जाएँगे।

हाइबरनेट भी इस प्रतिमान का उपयोग करता है। इसीलिए पिछले लेक्चर में हमने देखा कि डेटाबेस में एम्प्लोयी ऑब्जेक्ट को सेव करने की कोशिश करते समय सबसे पहले एक ट्रांजैक्शन खोला गया और सेव करने के बाद कमिट किया गया।

हम इस विषय में और अधिक विस्तार से जाएंगे, लेकिन अभी के लिए, केवल यह जान लें कि लेन-देन की आवश्यकता क्यों है और आमतौर पर उनका उपयोग कहाँ किया जाता है।

4.2 वस्तुओं को प्राप्त करना

यदि हाइबरनेट डेटा प्राप्त करने के अनुरोध को निष्पादित करता है, तो लेनदेन को स्पष्ट रूप से खोलने की कोई आवश्यकता नहीं है। यदि यह फिट दिखता है तो हाइबरनेट स्वयं ऐसा करेगा: इसकी सेटिंग्स, साथ ही SQL सर्वर की सेटिंग्स भी हैं।

हम विश्लेषण करेंगे कि डेटाबेस के साथ कैसे काम किया जाए। और उनमें से सबसे सरल एक वस्तु को उसके आईडी द्वारा प्राप्त कर रहा है । ऐसा करने के लिए, सत्रget() वस्तु पर विधि का उपयोग करें । ऐसे अनुरोध का सामान्य रूप:

Class Name = session.get(Class.class, ID);

उदाहरण:

public User getUserById(Integer id) {
    try (Session session = sessionFactory.openSession()) {
        User user = session.get(User.class, id);
        return user;
    }
}

4.3 वस्तुओं को सहेजना (जोड़ना)।

यदि आप अपनी वस्तु को डेटाबेस में सहेजना चाहते हैं, तो SQL स्तर पर एक क्वेरी निष्पादित की जाएगीडालना. इसलिए, आपके कार्यों को एक अलग लेन-देन के रूप में किया जाना चाहिए। साथ ही, दृढ़ता के लिए सत्रpersist() ऑब्जेक्ट की विधि का उपयोग करना बेहतर है ।

ऐसे अनुरोध का सामान्य रूप:

session.persist(An object);

विधि persist()न केवल आधार, बल्कि वस्तु को भी बदलती है। बात यह है कि जब हम किसी वस्तु को डेटाबेस में जोड़ते हैं, तो इस वस्तु को जोड़ने से पहले इसकी अपनी आईडी नहीं होती है । ठीक है, आमतौर पर ऐसा है, हालांकि बारीकियां हैं। और ऑब्जेक्ट जोड़ने के बाद पहले से ही एक आईडी है ।

public boolean saveUser(User user) {
    try (Session session = sessionFactory.openSession()) {
            Transaction transaction = session.beginTransaction();
            session.persist(user);
            transaction.commit();
            return true;
    }
    catch() {
    return false;
   	}
}

सत्र वस्तु में एक विधि भी होती है save()जो समान कार्य करती है। यह सिर्फ इतना है कि विधि save()पुराने हाइबरनेट मानक है और विधि persist()जेपीए मानक है।

4.4 वस्तुओं को हटाना

अगर आप किसी मौजूदा ऑब्जेक्ट को डिलीट करना चाहते हैं, तो ऐसा करना बहुत आसान है। ऐसा करने के लिए, सत्र वस्तु की एक विशेष विधि है - remove()

ऐसे अनुरोध का सामान्य रूप:

session.remove(An object);

और, बेशक, एक उदाहरण के साथ कोड लिखते हैं:

public boolean removeUser(User user) {
    try (Session session = sessionFactory.openSession()) {
            Transaction transaction = session.beginTransaction();
            session.remove(user);
            transaction.commit();
            return true;
    }
    catch() {
    return false;
   	}
}

यह इतना कठिन क्यों है, तुम पूछो?

ठीक है, सबसे पहले, डेटाबेस में कोई भी परिवर्तन हमेशा अलग होता है और हमेशा स्पष्ट परिणाम नहीं होता है। और दूसरी बात, इस वस्तु में इससे जुड़ी बाल वस्तुएँ हो सकती हैं, आदि। इसलिए विलोपन परिदृश्य अक्सर गैर-तुच्छ होते हैं।