हाइबरनेट में अलग, लगातार और क्षणिक वस्तुएं क्या हैं?


100

हाइबरनेट में अलग, लगातार और क्षणिक वस्तुएं क्या हैं? कृपया एक उदाहरण के साथ समझाएं।


session.close पर यह उन सभी ऑब्जेक्ट्स को नहीं निकालेगा जो सत्र के दायरे में बने रहे थे?
जिगर जोशी

हां, यह तब हटाया जाएगा जब भी आप किसी सत्र को बंद करते हैं, एक वस्तु की लगातार स्थिति अलग हो जाती है।
राहेल

@ राचेल अच्छी समझ के लिए कोड के साथ अच्छा लिंक प्रदान किया गया
प्रियांक ठक्कर

जवाबों:


161

एक newनिरंतर वर्ग का एक उदाहरण जो किसी के साथ जुड़ा नहीं है Session, डेटाबेस में कोई प्रतिनिधित्व नहीं है और कोई पहचानकर्ता मूल्य हाइबरनेट द्वारा क्षणिक नहीं माना जाता है :

Person person = new Person();
person.setName("Foobar");
// person is in a transient state

एक सतत उदाहरण डेटाबेस में एक पहचानकर्ता, एक पहचानकर्ता मूल्य है और एक के साथ जुड़ा हुआ है Session। तुम एक क्षणिक उदाहरण बना सकते हैं लगातार एक के साथ संबद्ध द्वारा Session:

Long id = (Long) session.save(person);
// person is now in a persistent state

अब, यदि हम closeहाइबरनेट करते हैं Session, तो निरंतर उदाहरण एक अलग उदाहरण बन जाएगा : यह Sessionअब और संलग्न नहीं है (लेकिन फिर भी संशोधित किया जा सकता है और एक नए Sessionबाद में फिर से जोड़ा जा सकता है )।

यह सब स्पष्ट रूप से पूरे अध्याय 10 में स्पष्ट किया गया है हाइबरनेट प्रलेखन की वस्तुओं के साथ काम करना जो मैं केवल ऊपर पैराफ्रासिंग कर रहा हूं। निश्चित रूप से, अवश्य पढ़ें।


एक पहचानकर्ता मान शायद एक वस्तु के लिए एक सख्त स्थिति नहीं है जो कि स्थिर रहने के लिए है क्योंकि मैं नियत पहचानकर्ता पीढ़ी की रणनीति का उपयोग कर सकता हूं।
अभिजीत कसनिया

उदाहरण में पढ़ा जाने वाला सत्र बंद करने के अलावा, एक सत्र से बुलाकर एक उदाहरण को अलग किया जा सकता है। यह इसे हाइबरनेट द्वारा प्रबंधित किए जाने से हटाता है (इस प्रकार परिवर्तन को स्वचालित रूप से डीबी पर वापस प्रचारित होने से रोकता है)। आप session.update () के माध्यम से db में परिवर्तन भेज सकते हैं, और इसे session.merge () के साथ पुनः संलग्न कर सकते हैं।
मोशु

1
हम कई बार फ्रेमवर्क द्वारा प्रदान किए गए मूल डॉक्स का पालन नहीं करते हैं .. जो कि कभी-कभी खुद को उचित विवरण के साथ छिपी हुई जानकारी होती है, बस उसका पता लगाने की आवश्यकता होती है। केवल
संभावना

A persistent instance has a representation in the databaseएक निरंतर इकाई को बचाने के संचालन से पहले डेटाबेस में एक प्रतिनिधित्व नहीं है।
ओ। बद्र

1
तो, अलग और क्षणिक इकाई अंतर आईडी की उपस्थिति है ? यदि मैं असाइन की गई आईडी के साथ नया उदाहरण बनाता हूं, तो औपचारिक रूप से यह क्षणिक है, क्योंकि यह अभी तक कायम नहीं है, लेकिन इसे अलग नहीं किया जा सकता है, क्योंकि इसमें एक आईडी है। सही?
रुस्लान Stelmachenko

9

सीतनिद्रा में वस्तु के निम्नलिखित राज्य हैं:

क्षणिक - नए संचालक के उपयोग से तात्कालिक वस्तुओं को क्षणिक वस्तु कहा जाता है।

एक वस्तु क्षणिक होती है अगर उसे नए ऑपरेटर का उपयोग करके तत्काल किया गया हो, और वह हाइबरनेट सत्र से संबद्ध न हो। डेटाबेस में इसका कोई निरंतर प्रतिनिधित्व नहीं है और कोई पहचानकर्ता मान असाइन नहीं किया गया है। यदि कोई संदर्भ अब तक नहीं होता है, तो कचरा संग्रहकर्ता द्वारा क्षणिक घटनाओं को नष्ट कर दिया जाएगा।

स्थायी - एक वस्तु जिसमें डेटाबेस की पहचान होती है, उसे एक स्थायी वस्तु कहा जाता है।

एक सतत उदाहरण डेटाबेस में एक प्रतिनिधित्व और एक पहचानकर्ता मूल्य है। यह सिर्फ बचाया या लोड किया गया हो सकता है; हालाँकि, यह एक सत्र के दायरे में है। हाइबरनेट लगातार स्थिति में किसी वस्तु में किए गए परिवर्तनों का पता लगाएगा और कार्य की इकाई के पूरा होने पर डेटाबेस के साथ राज्य को सिंक्रनाइज़ करेगा।

अलग किया गया - एक अलग उदाहरण एक ऐसी वस्तु है जो लगातार बनी रही है, लेकिन इसका सत्र बंद कर दिया गया है।

एक अलग किए गए उदाहरण को बाद के समय में एक नए सत्र में फिर से सेट किया जा सकता है, जिससे यह फिर से लगातार बना रहे। यह सुविधा काम के लंबे समय तक चलने वाली इकाइयों के लिए एक प्रोग्रामिंग मॉडल को सक्षम करती है जिसके लिए उपयोगकर्ता के थिंक-टाइम की आवश्यकता होती है। हम उन्हें उपयोगकर्ता के दृष्टिकोण से आवेदन लेनदेन, अर्थात, कार्य की एक इकाई कहते हैं।

http://webiwip.com/interview-questions-answers/hibernate-interview-questions/32012


5

मुझे गारबेज कलेक्टर के दृष्टिकोण से भी समझाते हैं।

हाइबरनेट के 3 ऑब्जेक्ट स्टेट्स हैं (या) हाइबरनेट के ऑब्जेक्ट स्कोप-

  1. क्षणिक अवस्था
  2. लगातार अवस्था
  3. अलग किया हुआ राज्य

एक कोड उदाहरण के साथ समझना बेहतर है-

आइए हम एक POJO वर्ग को स्टूडेंट ऑब्जेक्ट-> मानते हैं

Student student = new Student(); 

अब, यह छात्र वस्तु क्षणिक स्थिति में है


जब हम इस POJO ऑब्जेक्ट को हाइबरनेट सत्र-> से जोड़ते हैं

session.save(student);

अब यह POJO ऑब्जेक्ट लगातार स्थिति में है

(कचरा संग्रहकर्ता बिंदु- GC किसी भी वस्तु को मिटा नहीं सकता है, जो लगातार स्थिति में है। इसलिए हम कह सकते हैं कि लगातार स्थिति POJO वस्तुओं के लिए अस्थायी भंडारण की तरह है )


अगर हम प्रदर्शन करते हैं->

session.beginTransaction.commit();

उसके बाद POJO ऑब्जेक्ट स्थायी या डेटाबेस संग्रहण स्थिति पर है

(कचरा संग्रहकर्ता बिंदु- GC इस ऑब्जेक्ट को मिटा नहीं सकता क्योंकि यह POJO ऑब्जेक्ट अब JVM के दायरे से बाहर है और एक डेटाबेस के अंदर फॉर्म टेबल में संग्रहीत है। हम कह सकते हैं कि यह डेटाबेस संग्रहण स्थिति POOO के लिए स्थायी संग्रहण की तरह है वस्तुएं )


अगर हम प्रदर्शन करते हैं->

session.evict(student); 

तो POJO वस्तु बेदखल कर रहा है या अलग state.Soo को लगातार राज्य से हटा वापस POJO वस्तु के इस राज्य है राज्य अलग

(कचरा संग्रहकर्ता बिंदु- जीसीवीवी से अलग किए गए पीओजेओ ऑब्जेक्ट को जीसी आसानी से मिटा सकता है)


2

निम्नलिखित इकाई को देखते हुए:

@Entity
public class City {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)    
    private long id;

    // other fields and methods.
}

से हाइबरनेट 5.2 प्रलेखन (मैं भी शामिल किया है removedस्थिति):

क्षणिक

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

City city = new City();

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

इकाई में एक संबद्ध पहचानकर्ता होता है और वह दृढ़ता के संदर्भ में जुड़ा होता है। यह डेटाबेस में अभी तक भौतिक रूप से मौजूद हो भी सकता है और नहीं भी।

// city will be in a managed/persistent state and any changes to it, will be tracked by hibernate
// and reflected to the database when the persistence context is flushed.
session.save(city);

जुदा जुदा

इकाई के पास एक संबद्ध पहचानकर्ता है, लेकिन वह दृढ़ता के संदर्भ से संबद्ध नहीं है (आमतौर पर क्योंकि दृढ़ता संदर्भ बंद था या उदाहरण संदर्भ से निकाला गया था)

// city is in a detached state, Hibernate is no longer aware of the entity 
session.evict(city)

हटा दिया

इकाई में एक संबद्ध पहचानकर्ता होता है और वह दृढ़ता के संदर्भ में जुड़ा होता है, हालांकि इसे डेटाबेस से हटाने के लिए निर्धारित किया जाता है।

session.remove(city);


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


0

सही उत्तर के साथ पहले से ही पहचाने गए निरंतर, क्षणिक, अलग किए गए शब्द हाइबरनेट में सिर्फ वस्तु की स्थिति है।

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.