休眠实体的深度克隆

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

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


答案 1

要执行深度复制:

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

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


答案 2

休眠的杰肯序列化配置:

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