14

我想知道如何创建具有所有关联的持久对象的深层副本。假设我有以下模型。

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,但这样我将无法知道哪个属性(或关联)已被更改。

4

2 回答 2

7

要执行深层复制:

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

此实用程序方法将提供实体的深层副本,您可以执行您想要对克隆对象执行的操作。

于 2013-07-13T11:29:04.180 回答
0

休眠的 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 ...

于 2017-03-31T15:23:00.783 回答