संभावित वस्तु स्थिति विकल्प

जैसा कि आपने देखा होगा, जब कोई वस्तु हाइबरनेट से जुड़ी होती है, तो उसकी स्थिति को Persistent या Managed कहा जाता है । कितना सही? बनी रहती है या प्रबंधित?

यह संभव है और इसलिए, और इसलिए। जेपीए विनिर्देश के अनुसार, एक वस्तु में एक स्थायी स्थिति होती है, और हाइबरनेट विनिर्देश के अनुसार, इसकी स्थिति को प्रबंधित कहा जाता है।

हाइबरनेट में, डेटाबेस के साथ काम org.hibernate.Session प्रकार की वस्तु के माध्यम से किया जाता है । जेपीए के मुताबिक, कक्षा को javax.persistence.EntityManager कहा जाना चाहिए। यह वास्तव में एक बड़ी समस्या नहीं है, क्योंकि दोनों प्रकार के इंटरफेस हैं।

org.hibernate.Session इंटरफ़ेस इस तरह घोषित किया गया है:

interface Session extends java.lang.AutoCloseable, javax.persistence.EntityManager, HibernateEntityManager,    QueryProducer, java.io.Serializable, SharedSessionContract {

}

इसलिए, सत्र इंटरफ़ेस में वे सभी विधियाँ हैं जो EntityManager इंटरफ़ेस में हैं । लेकिन इसका अपना भी है, जो इसे हाइबरनेट के पुराने संस्करणों से विरासत में मिला है, जब अभी तक कोई जेपीए विनिर्देश नहीं था।

इस पूरी स्थिति का वर्णन इस प्रकार है:

आइए उन सभी विधियों पर एक नज़र डालें जो सत्र इंटरफ़ेस में हैं, साथ ही साथ उनके काम की बारीकियों पर भी।

लगातार () पद्धति की बारीकियां

किसी ऑब्जेक्ट को डेटाबेस में सहेजते समय, आपको दो चीजें याद रखने की आवश्यकता होती है।

सबसे पहले, ऑब्जेक्ट को सहेजने से अंततः SQL कमांड में से एक का निष्पादन होगा: INSERT या UPDATE। दूसरा, ऑब्जेक्ट की विधि को कॉल करने के तुरंत बाद ये क्रियाएं नहीं होंगीसत्र, लेकिन केवल लेन-देन बंद करने के बाद।

आइए कुछ सरल स्थिति पर विचार करें, उदाहरण के लिए, आपके पास एक उपयोगकर्ता वर्ग है :

@Entity
public class User {
	@Id
	@GeneratedValue
    public Integer id;

	@Columnt(name=”user_name”)
    public String name;
}

आइए इसके ऑब्जेक्ट को डेटाबेस में पर्सिस्ट () विधि का उपयोग करके सहेजते हैं ।

User user = new User();
user.setName("Kolyan");
session.persist(user);

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

यदि वस्तु पहले से ही डेटाबेस में है, तो कुछ नहीं होगा। हालाँकि, एक तीसरा मामला भी संभव है - एक वस्तु को डेटाबेस में अलग स्थिति के साथ सहेजने का प्रयास। इस मामले में, एक अपवाद फेंक दिया जाएगा। उदाहरण:

User user = new User();
user.setName("Kolyan");
session.persist(user);

session.evict(user);     // detach the object from the session
session.persist(user); // a PersistenceException will be thrown here!

सेव () विधि की बारीकियां

सेव () विधि वर्तमान हाइबरनेट द्वारा अपने पिछले संस्करणों से विरासत में मिली थी। इसके मूल में, यह पर्सिस्ट () विधि के समान है , यह INSERT विधि का उपयोग करके तालिका में एक नया रिकॉर्ड भी जोड़ता है। हालांकि, इसकी कई दिलचस्प बारीकियां हैं।

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

महत्वपूर्ण! हाइबरनेट आईडी विनिर्देश के अनुसार, यह कोई भी क्रमिक वस्तु हो सकती है, न कि केवल एक संख्या। यह एक स्ट्रिंग, एक संख्या, एक एनम, सामान्य रूप से कुछ भी हो सकता है जिसे डेटाबेस में तालिका के एक कॉलम में पूरी तरह से रखा जा सकता है।

सेव () विधि में एक क्रमबद्ध परिणाम प्रकार होता है, इसलिए इसका परिणाम सही प्रकार में डाला जाना चाहिए:

User user = new User();
user.setName("Kolyan");
Integer id = (Integer) session.save(user);

साथ ही, ऑब्जेक्ट की अलग स्थिति के मामले में सेव () विधि का एक अलग व्यवहार है। यह ऐसी वस्तु को नया मानता है और बस एक और प्रविष्टि जोड़ता है:

User user = new User();
user.setName("Kolyan");
Integer id = (Integer) session.save(user);

session.evict(user); 	// detach the object from the session
Integer id2 = (Integer) session.save(user);

Id और id2 चर भिन्न होंगे। डेटाबेस में तालिका में दो रिकॉर्ड जोड़े जाएंगे, प्रत्येक सेव () ऑपरेशन के लिए एक ।