2012-03-30 14 views
16

के साथ नई ऑब्जेक्ट में प्रति ऑब्जेक्ट मानों को हाइबरनेट कॉपी करें, मैं कुछ नेस्टेड टेबल के साथ एक कॉलम पीके का उपयोग करके एक रिलेशनल डीबी का उपयोग कर रहा हूं। मुझे अपनी परियोजना में सरल संग्रह जोड़ने की जरूरत है। संग्रह केवल तभी होता है जब एप्लिकेशन किसी विशेष स्थिति तक पहुंचता है, इसलिए मैं जो करने की उम्मीद कर रहा था वह मेरी मौजूदा हाइबरनेट ऑब्जेक्ट को एक नए इंस्टेंस में कॉपी कर रहा था जहां मौजूदा ऑब्जेक्ट को बरकरार रखने के दौरान नया इंस्टेंस एक नए आईडी से सहेजा जाएगा। मुझे यह पता लगाना प्रतीत नहीं होता कि मौजूदा ऑब्जेक्ट को एक नए इंस्टेंस में कैसे कॉपी किया जाए, बिना किसी नए इंस्टेंस फ़ील्ड को मैन्युअल रूप से सेट किया जाए। क्या किसी को ऐसा करने का एक आसान तरीका पता है?नए ऑब्जेक्ट आईडी

उत्तर

6

मैं भी हाइबरनेट के साथ काम कर रहा हूं और मुझे वही आवश्यकता मिल गई है। मैंने जो किया उसका पालन Cloneable को लागू करना था। नीचे एक कोड उदाहरण है कि इसे कैसे करें।

class Person implements Cloneable { 

     private String firstName; 
     private String lastName; 

     public Object clone() { 

      Person obj = new Person(); 
      obj.setFirstName(this.firstName); 
      obj.setLastName(this.lastName); 

      return obj; 
     } 

     public String getFirstName() { 
      return firstName; 
     } 

     public void setFirstName(String firstName) { 
      this.firstName = firstName; 
     } 

     public String getLastName() { 
      return lastName; 
     } 

     public void setLastName(String lastName) { 
      this.lastName = lastName; 
     } 
    } 

या आप प्रतिबिंब आधारित समाधान पर जा सकते हैं लेकिन मैं इसकी अनुशंसा नहीं करूंगा। अधिक जानकारी के लिए यह website देखें।

+1

आप नेस्टेड टेबल जैसे कि एक टोमनी आदि कैसे संभालते हैं? मुझे डर था कि मुझे फिर से सभी ऑब्जेक्ट चर सेट करना होगा।:( –

+1

मेरा मामला नेस्टेड ऑब्जेक्ट्स के बारे में नहीं था इसलिए मुझे उस समस्या का सामना नहीं हुआ ... मुझे डर है कि आपको गहरी प्रतिलिपि होगी ... हमेशा पीढ़ी होती है ... – Chan

+0

क्या आप मुझे इंगित कर सकते हैं पीढ़ी के बारे में एक लेख के लिए? –

2

आप ऑब्जेक्ट को क्लोन कर सकते हैं और आईडी को मिटा सकते हैं और उसे वापस सहेज सकते हैं ताकि एक नया आईडी असाइन किया जा सके।

तो

Person person = EmployeeDAO.get(empId); 
Person newPersonCopy = person.createCopyWithNoId() 
EmployeeDAO.add(newPersonCopy); 
इस मामले createCopyWithNoId() में

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

कृपया ध्यान दें कि मैंने विधि क्लोन को कॉल करने से परहेज किया है क्योंकि जो बाहर आता है वह सटीक क्लोन नहीं है क्योंकि हम आईडी को मैनिपुलेट करते हैं (इसे शून्य बनाते हैं);

जाने का एक और तरीका एक ऐसे निर्माता को जोड़ना होगा जो किसी व्यक्ति के ऑब्जेक्ट में लिया गया हो और एक नई ऑब्जेक्ट बनाया लेकिन बस आईडी फ़ील्ड को शून्य के डिफ़ॉल्ट मान पर छोड़कर सेट नहीं किया। फिर आप डीएओ का उपयोग जारी रखते हैं।

+1

साथ सबसे प्रभावी तरीके से उपयोग किया जा सकता तो आप इस पर थोड़ा और अधिक विस्तृत किया जा सका। मैं पूरी तरह से यकीन नहीं कर रहा हूँ किCopyWithNoId क्या है। मुझे लगता है कि वह जगह है जहां मुझे स्पष्टीकरण की आवश्यकता है। इसके अलावा, क्या यह एक गहरा क्लोन कर सकता है? –

0

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

23

बस ऑब्जेक्ट को पुनर्प्राप्त करें, इसे अलग करें, आईडी को शून्य पर सेट करें और इसे जारी रखें।

MyEntity clone = entityManager.find(MyEntity.class, ID); 
entityManager.detach(clone); 
clone.setId(null); 
entityManager.persist(clone); 

अपने वस्तु oneToMany रिश्ते हैं, तो आप सभी बच्चों, लेकिन अपने माता पिता वस्तु आईडी (persist कॉल के बाद उत्पन्न) अशक्त के बजाय स्थापित करने के लिए आपरेशन को दोहराने के लिए होगा।

बेशक आपको अपने OneToMany रिश्तों पर CASCADE persist को हटाना होगा क्योंकि अन्यथा आपका लगातार डीबी या एफके बाधा विफलताओं में सभी बच्चों के डुप्लिकेट बनाएगा।

+0

यह –

+0

के रूप में काम करता है मुझे उम्मीद है कि यह काम करने के लिए दृष्टिकोण लेकिन .... आश्चर्य, आश्चर्य है कि मैं एक अपवाद org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke() एक बच्चे पर आईडी – Legna

+1

को फिर से सेट करने का प्रयास करते समय? क्या आपने इसे बीफ़ को अलग किया अयस्क? (अलग-अलग नहीं है जब तक कि कैस्केड टाइप = DETACH) – Gab

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