2013-07-13 143 views
11

我想知道如何創建一個與其所有關聯的持久對象的深層副本。 讓我說我有以下模型。Hibernate實體的深度克隆

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

你可以使用傑克遜序列化在JSON的內存,它處理休眠延遲加載(你必須配置它) –

1

對Hibernate同時傑克遜系列化配置:

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 ...