राज्यांची यादी

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

जर तुमच्याकडे काही प्रकारचे एंटिटी ऑब्जेक्ट असेल जे तुम्ही हायबरनेट वापरून डेटाबेसमध्ये सेव्ह करू शकता, तर हायबरनेटच्या दृष्टिकोनातून, या ऑब्जेक्टच्या चार अवस्था असू शकतात:

  • क्षणिक
  • सक्तीचे (किंवा व्यवस्थापित)
  • अलिप्त
  • काढले

आणि तुमच्या आवडीसाठी, मी हे चित्र या व्याख्यानात जोडेन:

क्षणिक

खरं तर, सर्वकाही दिसते त्यापेक्षा बरेच सोपे आहे, जरी बारकावेशिवाय नाही. उदाहरणार्थ, तुम्ही Java कोड वापरून स्पष्टपणे तयार केलेल्या आणि हायबरनेट वापरून डेटाबेसमधून लोड न केलेल्या प्रत्येक Entity ऑब्जेक्टला क्षणिक (पारदर्शक) स्थिती असते.

EmployeeEntity employee = new EmployeeEntity();

क्षणिक स्थितीचा अर्थ असा आहे की हायबरनेटला या ऑब्जेक्टबद्दल कोणतीही कल्पना नाही, आणि ऑब्जेक्टवरील कोणत्याही कृतीचा हायबरनेटवर परिणाम होत नाही किंवा हायबरनेटचे या ऑब्जेक्टवर कार्य करत नाही.

अशा वस्तूंना POJO - प्लेन ओल्ड जावा ऑब्जेक्ट असेही म्हणतात . हा शब्द अनेकदा अवघड वर्तनासह विविध वस्तूंच्या विरुद्ध म्हणून वापरला जातो. Mockito ने तयार केलेल्या Moc ऑब्जेक्ट्स लक्षात ठेवा? इथे ते POJO नाहीत.

काही क्लायंट कोड क्षणिक स्थिती असलेल्या ऑब्जेक्टसह कार्य करत असल्यास, त्यांच्या परस्परसंवादाचे वर्णन एका सुपर-सिंपल योजनेद्वारे केले जाऊ शकते:

पर्सिस्टंट किंवा मॅनेज्ड

पुढील सर्वात सामान्य केस म्हणजे हायबरनेट इंजिनशी संबंधित वस्तू. त्यांच्या स्थितीला पर्सिस्टंट (किंवा व्यवस्थापित) म्हणतात. या स्थितीसह ऑब्जेक्ट मिळविण्याचे दोन मार्ग आहेत:

  • हायबरनेट वरून ऑब्जेक्ट लोड करा.
  • हायबरनेटमध्ये ऑब्जेक्ट सेव्ह करा.

उदाहरणे:

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

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

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

आणि क्लायंट कोड आणि व्यवस्थापित स्थितीतील ऑब्जेक्टचा परस्परसंवाद खालील चित्रासह वर्णन केला जाऊ शकतो:

अलिप्त

जेव्हा ऑब्जेक्ट सत्रापासून विलग केला जातो तेव्हा पुढील स्थिती असते. म्हणजेच, एकदा ऑब्जेक्ट हायबरनेट सत्राशी संलग्न केले होते, परंतु नंतर सत्र बंद झाले किंवा व्यवहार समाप्त झाला आणि हायबरनेट यापुढे या ऑब्जेक्टचे निरीक्षण करत नाही.

उदाहरण:

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

पहिल्या उदाहरणात, सत्र बंद होते. दुसऱ्या प्रकरणात, आम्ही स्पष्टपणे सूचित केले आहे की आम्हाला evict() पद्धत वापरून सेशनमधून ऑब्जेक्ट वेगळे करायचे आहे .

नवीन कोड-ऑब्जेक्ट परस्परसंवाद योजना यासारखी दिसेल:

आणि येथे ते मनोरंजक आहे. जर तुमचा ऑब्जेक्ट हायबरनेट मधून प्राप्त झाला असेल, तर कदाचित तुम्हाला वास्तविक ऑब्जेक्ट ऐवजी प्रॉक्सी देण्यात आली आहे. आणि हे प्रॉक्सी ऑब्जेक्ट, सत्रापासून डिस्कनेक्ट केल्यानंतर, त्याच्या पद्धती कॉल केल्यावर अपवाद टाकेल.

हायबरनेटसह काम करताना सर्व नवशिक्यांसाठी ही सर्वात सामान्य समस्या आहे. तुम्‍ही एण्‍टीटी ऑब्‍जेक्‍टसोबत काम करत असताना तुम्‍हाला यासारख्या प्रश्‍नांची उत्‍तरे कोणत्‍याही वेळी माहित असणे आवश्‍यक आहे :

  • तुमच्याकडे वास्तविक वस्तू आहे की वास्तविक वस्तूची फक्त प्रॉक्सी आहे?
  • तुम्ही सध्या व्यवहारात आहात की नाही?
  • हा एक वाचन-लेखन व्यवहार आहे की केवळ-वाचनीय व्यवहार आहे?
  • वस्तू लेझीलोडिंग यंत्रणेद्वारे व्यवस्थापित केली जाते का?
  • ऑब्जेक्टचे कोणते भाग आधीच मेमरीमध्ये लोड केले आहेत आणि प्रवेश केल्यावर कोणते भाग लोड केले जातील?
  • तुमची वस्तू आश्रित वस्तूंशी कशी जोडलेली आहे?

चांगली बातमी अशी आहे की बहुतेक वेळा ते स्पष्ट असते. परंतु तरीही हे सर्व हुड अंतर्गत कसे कार्य करते हे समजून घेणे आवश्यक आहे. डिक्लेरेटिव्ह प्रोग्रामिंग म्हणजे ते काय आहे - तुम्ही 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