2013-07-13 92 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 ...