संभाव्य ऑब्जेक्ट स्थिती पर्याय

तुमच्या लक्षात आले असेल की, जेव्हा एखादी वस्तू हायबरनेटला जोडली जाते, तेव्हा तिच्या स्थितीला पर्सिस्टंट किंवा मॅनेज्ड म्हणतात . किती बरोबर? कायम किंवा व्यवस्थापित?

हे शक्य आहे आणि त्यामुळे, आणि त्यामुळे. जेपीए विनिर्देशानुसार, ऑब्जेक्टची पर्सिस्ट स्थिती असते आणि हायबरनेट स्पेसिफिकेशननुसार, त्याच्या स्थितीला व्यवस्थापित म्हटले जाते.

हायबरनेटमध्ये, डेटाबेससह कार्य org.hibernate.Session प्रकारच्या ऑब्जेक्टद्वारे केले जाते . JPA नुसार, वर्गाला javax.persistence.EntityManager असे म्हटले पाहिजे. ही खरोखर मोठी समस्या नाही, कारण दोन्ही प्रकारचे इंटरफेस आहेत.

org.hibernate.Session इंटरफेस असे घोषित केले आहे:

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

}

म्हणून, सत्र इंटरफेसमध्ये EntityManager इंटरफेसमध्ये असलेल्या सर्व पद्धती आहेत . परंतु त्याचे स्वतःचे देखील आहे, जे त्याला हायबरनेटच्या पूर्वीच्या आवृत्त्यांकडून वारशाने मिळाले आहे, जेव्हा अद्याप कोणतेही JPA तपशील नव्हते.

या संपूर्ण परिस्थितीचे खालीलप्रमाणे वर्णन केले आहे:

सत्र इंटरफेसमध्ये असलेल्या सर्व पद्धती तसेच त्यांच्या कामातील बारकावे पाहू या.

Persist() पद्धतीचे बारकावे

डेटाबेसमध्ये ऑब्जेक्ट सेव्ह करताना, आपल्याला दोन गोष्टी लक्षात ठेवण्याची आवश्यकता आहे.

प्रथम, ऑब्जेक्ट सेव्ह केल्याने शेवटी एसक्यूएल कमांडपैकी एकाची अंमलबजावणी होईल: INSERT किंवा UPDATE. दुसरे म्हणजे, या क्रिया ऑब्जेक्टच्या पद्धतीला कॉल केल्यानंतर लगेच होणार नाहीतसत्र, परंतु व्यवहार बंद केल्यानंतरच.

चला काही सोप्या परिस्थितीचा विचार करूया, उदाहरणार्थ, आपल्याकडे वापरकर्ता वर्ग आहे :

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

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

persist() पद्धत वापरून त्याचा ऑब्जेक्ट डेटाबेसमध्ये सेव्ह करू .

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!

save() पद्धतीचे बारकावे

save() पद्धत सध्याच्या हायबरनेटने त्याच्या मागील आवृत्त्यांमधून वारसाहक्काने प्राप्त केली होती. त्याच्या गाभ्यामध्ये, हे persist() पद्धतीसारखेच आहे , ते INSERT पद्धत वापरून टेबलमध्ये नवीन रेकॉर्ड देखील जोडते. तथापि, त्यात अनेक मनोरंजक बारकावे आहेत.

प्रथम, ही पद्धत एक मूल्य देते - ऑब्जेक्टचा नवीन आयडी . तुम्हाला आधीच माहित आहे की, डेटाबेसमध्ये जोडण्यापूर्वी ऑब्जेक्ट्सना आयडी नसतो आणि तो डेटाबेसद्वारे आधीच नियुक्त केलेला असतो. तर, सेशन ऑब्जेक्टची save() पद्धत सेव्ह केलेल्या ऑब्जेक्टला नियुक्त केलेला ID परत करते.

महत्वाचे! हायबरनेट आयडी स्पेसिफिकेशननुसार, ती फक्त संख्याच नाही तर कोणतीही अनुक्रमिक वस्तू असू शकते. हे स्ट्रिंग, संख्या, एनम, सर्वसाधारणपणे काहीही असू शकते जे संपूर्णपणे डेटाबेसमधील टेबलच्या एका कॉलममध्ये ठेवता येते.

save() पद्धतीमध्ये अनुक्रमित परिणाम प्रकार आहे, त्यामुळे त्याचा निकाल योग्य प्रकारावर टाकला जाणे आवश्यक आहे:

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

तसेच, ऑब्जेक्टच्या डिटेच्ड स्टेटच्या बाबतीत save() पद्धतीचे वर्तन वेगळे असते. ते अशा ऑब्जेक्टला नवीन मानते आणि फक्त दुसरी एंट्री जोडते:

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 व्हेरिएबल्स वेगळे असतील. डेटाबेसमधील टेबलमध्ये दोन रेकॉर्ड जोडल्या जातील, प्रत्येक save() ऑपरेशनसाठी एक .