राज्यों की सूची

और अब मजा शुरू होता है। हम इकाई वस्तुओं की अवस्थाओं का अध्ययन करेंगे। आपको हर चीज के लिए और हाइबरनेट का उपयोग करने के लिए भी भुगतान करना होगा। क्या आपको नहीं लगता कि एचक्यूएल सीखना इतना महंगा है? नहीं, जीवन थोड़ा और जटिल है.

यदि आपके पास किसी प्रकार की एंटिटी ऑब्जेक्ट है जिसे आप हाइबरनेट का उपयोग करके डेटाबेस में सहेज सकते हैं, तो हाइबरनेट के दृष्टिकोण से, इस ऑब्जेक्ट में चार अवस्थाएँ हो सकती हैं:

  • क्षणिक
  • लगातार (या प्रबंधित)
  • जुदा जुदा
  • निकाला गया

और आपकी रुचि के लिए, मैं इस चित्र को इस व्याख्यान में जोड़ूंगा:

क्षणिक

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

EmployeeEntity employee = new EmployeeEntity();

क्षणिक स्थिति का अर्थ है कि हाइबरनेट को इस वस्तु के बारे में कोई पता नहीं है, और वस्तु पर कोई कार्रवाई हाइबरनेट को प्रभावित नहीं करती है, न ही इस वस्तु पर हाइबरनेट का काम करता है।

ऐसी वस्तुओं को POJO - प्लेन ओल्ड जावा ऑब्जेक्ट भी कहा जाता है । इस शब्द का प्रयोग अक्सर पेचीदा व्यवहार वाली विभिन्न वस्तुओं के विपरीत के रूप में किया जाता है। मॉकिटो द्वारा बनाए गए मोक ऑब्जेक्ट याद हैं? यहाँ वे POJO नहीं हैं।

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

लगातार या प्रबंधित

अगला सबसे आम मामला हाइबरनेट इंजन से संबंधित वस्तुएं हैं। उनकी स्थिति को Persistent (या प्रबंधित) कहा जाता है। इस स्थिति के साथ वस्तु प्राप्त करने के दो तरीके हैं:

  • हाइबरनेट से वस्तु लोड करें।
  • वस्तु को हाइबरनेट में सहेजें।

उदाहरण:

Employee employee = session.load(Employee.class, 1);
Employee employee = new Employee ();
session.save(employee);

ऐसी वस्तु आमतौर पर डेटाबेस में किसी प्रकार के रिकॉर्ड से मेल खाती है, इसमें एक आईडी और पसंद होती है। यह ऑब्जेक्ट हाइबरनेट सत्र से जुड़ा हुआ है, और सामान्य तौर पर इसे वास्तविक वस्तु द्वारा नहीं, बल्कि किसी प्रकार के प्रॉक्सी द्वारा दर्शाया जा सकता है।

यह बहुत संभव है कि session.load() मेथड को कॉल करने के बाद , आपको कुछ स्टब ऑब्जेक्ट (प्रॉक्सी) वापस मिल जाएगा, और डेटाबेस के सभी कॉल इस ऑब्जेक्ट के मेथड्स को कॉल करने के बाद ही किए जाएंगे। लेकिन हम इस तरह के विवरण के बारे में थोड़ी देर बाद बात करेंगे।

और प्रबंधित स्थिति में क्लाइंट कोड और ऑब्जेक्ट की बातचीत को निम्न चित्र के साथ वर्णित किया जा सकता है:

जुदा जुदा

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

उदाहरण:

session.close();
session.evict(entity);

पहले उदाहरण में, सत्र बंद कर दिया गया था। दूसरे मामले में, हमने स्पष्ट रूप से संकेत दिया है कि हम बेदखल () विधि का उपयोग करके सत्र से वस्तु को अलग करना चाहते हैं ।

नई कोड-ऑब्जेक्ट इंटरेक्शन स्कीम इस तरह दिखेगी:

और यहाँ वह जगह है जहाँ यह दिलचस्प हो जाता है। यदि आपका ऑब्जेक्ट हाइबरनेट से प्राप्त किया गया था, तो यह संभावना है कि आपको वास्तविक वस्तु के बजाय प्रॉक्सी दिया गया हो। और यह प्रॉक्सी ऑब्जेक्ट, सत्र से डिस्कनेक्ट करने के बाद, इसके तरीकों को बुलाए जाने पर अपवादों को फेंक देगा।

हाइबरनेट के साथ काम करते समय सभी नौसिखियों के लिए यह सबसे आम समस्या है। जब आप किसी इकाई वस्तु के साथ काम कर रहे हों तो आपको किसी भी समय इस तरह के प्रश्नों का उत्तर जानने की आवश्यकता है :

  • क्या आपके पास वास्तविक वस्तु है या वास्तविक वस्तु से सिर्फ प्रॉक्सी है?
  • क्या आप वर्तमान में लेन-देन में हैं या नहीं?
  • क्या यह पढ़ने-लिखने का लेन-देन है या केवल-पढ़ने के लिए लेन-देन है?
  • क्या वस्तु LazyLoading तंत्र द्वारा प्रबंधित की जाती है?
  • ऑब्जेक्ट के कौन से हिस्से पहले से ही मेमोरी में लोड किए गए हैं, और कौन से हिस्से एक्सेस किए जाने पर लोड किए जाएंगे?
  • आपकी वस्तु आश्रित वस्तुओं से कैसे जुड़ी है?

अच्छी खबर यह है कि ज्यादातर समय यह स्पष्ट होता है। लेकिन आपको अभी भी यह समझने की जरूरत है कि यह हुड के नीचे कैसे काम करता है। घोषणात्मक प्रोग्रामिंग वह है जो यह है - आप 10 मिनट में कोड लिख सकते हैं, समझें कि यह काम क्यों नहीं करता जैसा कि करना चाहिए - 10 घंटे में :)

निकाला गया

और आपकी इकाई वस्तु की अंतिम स्थिति को हटाया जा सकता है। जैसा कि आप शायद इसके नाम से अनुमान लगा चुके हैं, यह एक दूरस्थ वस्तु की स्थिति है।

यह स्थिति इस तथ्य के कारण प्रकट होती है कि यदि आप डेटाबेस से किसी वस्तु को हटाते हैं, तो जावा वस्तु तुरंत कहीं गायब नहीं होगी।

Employee employee = session.load(Employee.class, 1);
//after loading the object's state is Persisted

session.remove(employee);
//after deletion, the state of the object is Removed

session.save(employee);
//and now Persisted again

session.close();
//and now the Detached state