Глубокий клон объекта спящего режима
Мне интересно, как я могу создать глубокую копию сохраняемого объекта со всей его связью.
Скажем, у меня есть следующая модель.
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));
Хорошо, это требует некоторой памяти и процессора...