Безопасное клонирование объекта Hibernate Spring JPA - Javassist

Я клонирую объект с помощью метода Spring BeanUtils.copyProperties (source, target, excludes), и проблема в том, что вызывается метод с именем 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 выдает внутреннюю ошибку гибернации.

Есть ли более простой способ клонировать объект, чем то, что я делаю?


person chrislhardin    schedule 14.11.2017    source источник
comment
какое исключение выбрасывает спящий режим?   -  person Amer Qarabsa    schedule 15.11.2017
comment
На самом деле не обращайте внимания на ошибку ... Ошибки нет ... Клонированный экземпляр выходит точно так же, как оригинал. Отражение попадает в setHandler, и по какой-то причине весь объект становится заполненным.   -  person chrislhardin    schedule 15.11.2017


Ответы (1)


Я не думаю, что вам действительно нужно клонировать. Просто извлеките объект, а затем удалите объект из сеанса, и это фактически будет клон: Можно ли отсоединить объект Hibernate, чтобы изменения объекта не сохранялись в базе данных автоматически?. Если вы захотите обновить экземпляр, снова запустите другой сеанс.

person Derrops    schedule 15.11.2017