• Как правильно сделать полную копию объекта, со всеми потомками в hibernate?

    @getatonheim Автор вопроса
    bobzer: хорошо, спасибо, буду пытаться дальше, отпишусь о результатах.
  • Как правильно сделать полную копию объекта, со всеми потомками в hibernate?

    @getatonheim Автор вопроса
    Еще вопрос, когда я делаю set(get()) то полю присваивается объект javaassist, то есть новый объект опять становится roxy объектов со всеми вытекающими. Делаю get какого-нибудь поля у entity, но оно все еще остается javaassist, разве это верно? разве он не должен вытянуть его с базы и сделать его реальным значением, а не ссылкой ?
  • Как правильно сделать полную копию объекта, со всеми потомками в hibernate?

    @getatonheim Автор вопроса
    Я думаю что lazy="false" может помочь, но это забьет память, а приложение очень прожорливое.
  • Как правильно сделать полную копию объекта, со всеми потомками в hibernate?

    @getatonheim Автор вопроса
    Пункт 4 похож на костыль, а мне хочется чтобы все было "как надо", а вот что это "как надо" я до сих пор понять не могу) На StackOverflow до сих пор не могу найти решения и + многие вопросы без ответа *(
  • Как правильно сделать полную копию объекта, со всеми потомками в hibernate?

    @getatonheim Автор вопроса
    Здравствуйте! Большое спасибо за советы. Расскажу о моих попытках. С помощью приведенных мной способов клонирования сущности со всеми дочерними объектами, как я уже сказал, ни один не работал. Зато удалось это сделать вот таким, нехитрым способом (:
    public static Object copyXML(Object fromBean) {
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            XMLEncoder out = new XMLEncoder(bos);
            out.writeObject(fromBean);
            out.close();
            ByteArrayInputStream bis = new
    ByteArrayInputStream(bos.toByteArray());
            XMLDecoder in = new XMLDecoder(bis);
            Object toBean = in.readObject();
            in.close();
            return toBean;
        }


    После дебаггинга, выяснилось, что объект и вправду скопировался, но из-за lazy initialization, простым save'ом его не записать. Поэтому я попробовал сначала удалить оригинальный объект из кэша сессии, обновить кэш, заново из базы достать этот же объект, склонировать его, и новую копию записать в базу. Это не сработало.
    Long id = ((AEntity) entity).getEntryKey();
        			this.getSessionFactory().getCurrentSession().evict(entity);
        			flush();
        			Entity newEntity = (Entity) this.getSessionFactory().getCurrentSession().load(entity.getClass(), id);
        			flush();
        			Entity entityCopy = (Entity) copyXML(newEntity);
        			this.getSessionFactory().getCurrentSession().persist(entityCopy);


    По 3-ему пункту: так и вправду работает, но почему-то порождаются записи в ненужных таблицах, там нужен более глубокий анализ, который я временно оставил и решил что попробую вначале сделать полную копию всего дерева объектов. Пока безрезултатно.

    Проблема на данный момент в том, что я постоянно получаю proxy объект и клонируются только ссылки, не сами дочерние объекты. В общем я на днях этим еще буду заниматься и отпишусь поподробнее.