Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate实体的深度克隆_Java_Hibernate_Database Design_Persistence_Clone - Fatal编程技术网

Java Hibernate实体的深度克隆

Java Hibernate实体的深度克隆,java,hibernate,database-design,persistence,clone,Java,Hibernate,Database Design,Persistence,Clone,我想知道如何创建持久化对象及其所有关联的深度副本。 假设我有下面的模型 class Document { String title; String content; Person owner; Set<Citation> citations; } class Person { String name; Set<Document> documents; } class Citation { String title

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

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

要执行深度复制:

public static <T> T clone(Class<T> clazz, T dtls) { 
        T clonedObject = (T) SerializationHelper.clone((Serializable) dtls); 
        return clonedObject; 
  }
公共静态T克隆(类clazz,T dtls){
T clonedObject=(T)SerializationHelper.clone((Serializable)dtls);
返回克隆对象;
}

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

hibernate的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…

这个问题可能是,它无法处理延迟加载集合和版本属性。更好的方法是自己在每个类中编写深度复制方法。无法处理惰性字段,无法在新克隆对象中初始化惰性集合。您可以在mermory中使用Jackson在json中序列化它处理hibernate惰性加载(您必须配置它)