Глубокий клон объекта спящего режима

Мне интересно, как я могу создать глубокую копию сохраняемого объекта со всей его связью. Скажем, у меня есть следующая модель.

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

Конфигурация сериализации 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));

Хорошо, это требует некоторой памяти и процессора...