Безопасно клонируйте объект JPA Hibernate Spring - Javassist
Я клонирую сущность, используя метод Spring BeanUtils.copyProperties (source, target, exclude), и проблема в том, что существует метод setHandler, который вызывается, и он в основном сбрасывает все свойства, которые я установил в моем списке исключений во время копирования. Если я исключаю обработчик, то получаю исключение, сохраняющее новый объект.
Я просто хочу сделать клон объекта Hibernate, исключая 10 свойств и сохранить новый объект.
public static <T> T cloneClass(T existing, Class<? extends Annotation> ignores)
throws Exception {
final Collection<String> excludes = new ArrayList<>();
Set<Method> annotated = getMethodsWithAnnotation(ignores, existing.getClass());
for (Method method : annotated) {
if (!method.getName().startsWith("get") && !method.getName().startsWith("is"))
continue;
String exclude = ReflectUtil.decap(method.getName());
log.debug("Exclude from copy: " + exclude);
excludes.add(exclude);
}
excludes.add("handler"); <-- must have this
Object newInstance = existing.getClass().newInstance();
String[] excludeArray = excludes.toArray(new String[excludes.size()]);
BeanUtils.copyProperties(existing, newInstance, excludeArray);
return (T) newInstance;
}
Если я не включу
excludes.add("handler"); <-- must have this
Затем происходит то, что целевой объект получает все свойства из источника и в основном делает мой список исключений бесполезным, но как только я пытаюсь сохранить этот объект, Hibernate выдает внутреннюю ошибку hibernate.
Есть ли более простой способ клонировать объект, чем то, что я делаю?
1 ответ
Я не думаю, что вам действительно нужно заниматься клонированием. Просто извлеките объект, а затем удалите объект из сеанса, и он фактически является клоном: возможно ли отключить объект Hibernate, чтобы изменения в объекте не сохранялись автоматически в базе данных?, Снова запустите другой сеанс, как только вы захотите обновить экземпляр.