2011-03-10 12 views
10

में कैसे काम करता है मुझे पता है कि ऑब्जेक्ट अलग-अलग स्थिति में है जब हम पहले ही सहेजते हैं और हमें इसे फिर से संलग्न करना होगा।पृथक ऑब्जेक्ट हाइबरनेट

मान लीजिए कि मेरे पास HTML टेक्स्ट फ़ील्ड्स वाला एक रूप है और वहां सहेजें बटन है जो डेटाबेस में टेक्स्ट सहेजता है।

मैं thise कोड

public void edit(Person person) { 
    logger.debug("Editing existing person"); 

    // Retrieve session from Hibernate 
    Session session = sessionFactory.getCurrentSession(); 

    // Retrieve existing person via id 
    Person existingPerson = (Person) session.get(Person.class, person.getId()); 

    // Assign updated values to this person 
    existingPerson.setFirstName(person.getFirstName()); 
    existingPerson.setLastName(existingPerson.getLastName()); 
    existingPerson.setMoney(existingPerson.getMoney()); 

    // Save updates 
    session.save(existingPerson); 
} 

अब मैं डेटा को बचाने के लिए समय के किसी भी संख्या को बचाने के हिट कर सकते हैं।

अब इसका मतलब यह है कि एक बार जब मैं पहली बार बचाता हूं, तो यह अलग हो जाता है। तो क्या मुझे इसके लिए कुछ खास करने की ज़रूरत है या इससे कोई फर्क नहीं पड़ता।

मैं क्या हालत मैं अलग स्थिति के बारे में कुछ भी कार्यक्रम की जरूरत के तहत जानना चाहते

उत्तर

21

जैसे ही, बचाने लोड, या एक इकाई लगाने के लिए प्रयोग किया जाता सत्र के रूप में बंद कर दिया गया, इकाई अलग हो जाता है। इसका मतलब है कि यह अब किसी सत्र से कनेक्ट नहीं है, और किसी अन्य पीओजेओ की तरह काम करता है।

जब कोई इकाई संलग्न होती है और आप इसकी एक गुण को बदलते हैं, तो हाइबरनेट स्वचालित रूप से डेटाबेस में (संबंधित फ्लश/प्रतिबद्ध समय पर) में आपके द्वारा किए गए परिवर्तनों को सहेजता है।

जब यह अलग हो जाता है, तो ऑब्जेक्ट में किए गए परिवर्तन स्वचालित रूप से डेटाबेस में सहेजे नहीं जाते हैं। परिवर्तनों को सहेजने के लिए, session.update() या session.merge() को कॉल करके आपको इसे स्वयं करने की आवश्यकता है। दोनों विधियां एक ही चीज़ को कम या कम करती हैं, लेकिन इसे अलग-अलग करें। मैं व्यक्तिगत रूप से मर्ज का उपयोग करना पसंद करता हूं, जो कम खतरनाक है और कम बग की ओर जाता है।

अधिक जानकारी के

अपने कोड में के लिए पढ़ें http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/#objectstate-detached, संपादित विधि करने के लिए तर्क के रूप में पारित कर दिया व्यक्ति शायद अलग है। आप जो कर रहे हैं वह उस व्यक्ति को उसी आईडी के साथ प्राप्त कर रहा है जैसा सत्र से गुजरता है। इस प्रकार existingPerson संलग्न है। फिर आप अलग-अलग संपत्तियों से जुड़े मौजूदा व्यक्तियों को सभी गुणों की प्रतिलिपि बनाते हैं। और अंत में, आप मौजूदाPerson को सहेजते हैं।

  1. बचाने आप क्या सोचते हैं यह करता है नहीं करता है:

    3 इस कोड के साथ समस्या है। एक नया व्यक्ति वस्तु डालने के लिए बचाओ। आपका मौजूदा व्यक्ति पहले से मौजूद है और पहले से ही एक आईडी है, इसलिए उपयोग करने के लिए ऑपरेशन अद्यतन या विलय है।

  2. तुम भी अद्यतन का उपयोग करें या मर्ज करते हैं, क्योंकि के बाद से existingPerson सत्र से जुड़ा हुआ है की जरूरत नहीं है, परिवर्तन (setFirstName, setLastName, आदि) स्वचालित रूप से लगातार हाइबरनेट द्वारा फ्लश समय में किया जाएगा। यह पारदर्शी है।
  3. आपके द्वारा लागू एल्गोरिदम एक ही है (कैस्केड को छोड़कर, आदि) जैसा कि विलय द्वारा उपयोग किया जाता है, जो यह सब आपके लिए स्वचालित रूप से करता है।

यह इस प्रकार परिवर्तित करने के लिए किया जाना चाहिए:

public void edit(Person person) { 
    logger.debug("Editing existing person, which is a detached object"); 

    // Retrieve session from Hibernate 
    Session session = sessionFactory.getCurrentSession(); 

    // Retrieve existing person via id, then copy everything from detached person 
    // to attached one, and return attached one 
    Person existingPerson = (Person) session.merge(person); 
} 
+0

आप कृपया अपने प्रयोग स्थिति जहां मैं व्यक्ति विवरण संपादित करें और बटन को बचाने के लिए सरल पृष्ठ है में इस व्याख्या कर सकते हैं। मुझे पता करने के लिए जब मेरी व्यक्ति वस्तु sate अलग –

+0

मैं अपनी वास्तुकला पता नहीं है हो जाएगा चाहते हैं, तो यह बताने के लिए मुश्किल है। आप हमें बताएँ कि आपके आवेदन architected है, और हमें कोड के प्रासंगिक हिस्सा दिखाने (उदाजिस तरह से आप सत्र प्राप्त करते हैं, ऑब्जेक्ट प्राप्त/सहेजते हैं, और सत्र बंद करते हैं), तो हम और अधिक मदद कर सकते हैं। –

+0

मैंने अपने व्यक्ति सेवा वर्ग से प्रश्नों में कोड जोड़ा है जहां मैं जेएसपी फॉर्म का उपयोग कर वेब पेज पर व्यक्ति को संपादित करता हूं। –

संबंधित मुद्दे