2013-07-13 8 views
11

का गहरा क्लोन मैं सोच रहा हूं कि मैं अपने सभी सहयोगियों के साथ एक सतत वस्तु की गहरी प्रति कैसे बना सकता हूं। मान लें कि मेरे पास निम्न मॉडल है।हाइबरनेट इकाई

class Document { 
    String title; 
    String content; 
    Person owner; 
    Set<Citation> citations; 
} 

class Person { 
    String name; 
    Set<Document> documents; 
} 

class Citation { 
    String title; 
    Date date; 
    Set<Document> documents; 
} 

मैं एक परिदृश्य है जिसमें एक उपयोगकर्ता एक व्यक्ति से एक विशेष दस्तावेज़ की एक प्रतिलिपि हड़पने और दस्तावेज़ उसकी/उसकी फिर बाद में वह/वह उसकी सामग्री और नाम बदल सकते हैं बनाने के लिए चाहते हो सकता है है। उस मामले में मैं उस तरह के परिदृश्य को लागू करने के एक तरीके के बारे में सोच सकता हूं जो उस दस्तावेज़ की गहरी प्रतिलिपि बना रहा है (इसके संघों के साथ)।

या शायद अगर किसी को डेटा की बड़ी प्रतिलिपि किए बिना ऐसी कोई काम करने का कोई अन्य संभावित तरीका पता है क्योंकि मुझे पता है कि यह ऐप प्रदर्शन के लिए बुरा हो सकता है।

मैं भी मूल दस्तावेज का संदर्भ बना रहा था जैसे कि originalDocument विशेषता है लेकिन इस तरह से मैं यह नहीं जान पाऊंगा कि कौन सा विशेषता (या शायद एसोसिएशन) बदल दी गई है।

उत्तर

7

एक गहरी प्रतिलिपि करने के लिए:

public static <T> T clone(Class<T> clazz, T dtls) { 
     T clonedObject = (T) SerializationHelper.clone((Serializable) dtls); 
     return clonedObject; 
    } 

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

+2

इस एक के साथ समस्या हो सकती है, यह नहीं कर सकते आलसी लोड संग्रह और संस्करण गुणों को संभालें। आईएमएचओ बेहतर तरीका प्रत्येक वर्ग में गहरी प्रतिलिपि विधियों को लिख देगा। –

+0

आलसी फ़ील्ड को संभाल नहीं सकता है, नए क्लोन ऑब्जेक्ट में आलसी संग्रह शुरू करने में विफल रहा है। –

+0

आप जैक्सन में जर्सन में सीरियलाइज के लिए जैक्सन का उपयोग कर सकते हैं, यह हाइबरनेट आलसी लोडिंग को संभालता है (आपको इसे कॉन्फ़िगर करना होगा) –

1

Jackon क्रमबद्धता विन्यास:

ObjectMapper mapperInstance 
    Hibernate4Module module = new Hibernate4Module(); 
     module.configure(Hibernate4Module.Feature.FORCE_LAZY_LOADING, false); 

     mapperInstance.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false); 
     mapperInstance.disable(MapperFeature.USE_GETTERS_AS_SETTERS); 
     mapperInstance.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); 
     mapperInstance.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); 

     mapperInstance.registerModule(module); 

और अगले

clone = getMapperInstance().readValue(getMapperInstance().writeValueAsString(this)); 

ठीक है यह कुछ स्मृति और CPU लागत ...

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