Глубокая копия в JPA

Попытайтесь поместить свой JavaScript в блоке CDATA как это:

<script type="text/javascript">
<![CDATA[
// content of your Javascript goes here
]]>
</script> 

, который должен заставить его передать проверку. Чтобы быть дополнительным сейфом, можно добавить комментарии JavaScript вокруг тегов CDATA для сокрытия их от более старых браузеров, кто не понимает ТЕГА CDATA:

<script type="text/javascript">
/* <![CDATA[ */
// content of your Javascript goes here
/* ]]> */
</script> 
14
задан User1 9 July 2009 в 21:49
поделиться

4 ответа

Мне удалось получить полную копию для работы, как описано в вопросе. Необходимо быстро загрузить весь график и сбросить @Id на ноль или ноль. Я обнаружил, что в Hibernate SessionFactory действительно есть методы, помогающие в этом процессе.

Другие приведенные выше рекомендации для глубоких копий, похоже, не работают. Конечно, проблема могла быть между клавиатурой и стулом. Но сейчас он работает.

Всем спасибо!

2
ответ дан 1 December 2019 в 15:02
поделиться

Я не совсем уверен, что обнуление идентификаторов уже управляемых объектов - хорошая идея, особенно. когда ваши объекты не имеют equals () , определенного как равенство идентификаторов. Реализация JPA могла иметь управляемые объекты в каком-то кэше и беситься при игре с идентификаторами объектов там.

Я считаю, что было бы безопаснее следовать ответу РК и выполнять реальное копирование объектов.

3
ответ дан 1 December 2019 в 15:02
поделиться

Зачем вам сделать это? Это немного похоже на взлом.

При этом Apache Commons BeanUtils содержит методы cloneBean () и copyProperties () для создания (мелких) копий объектов. Чтобы сделать полную копию, вы можете написать метод, предложенный здесь .

1
ответ дан 1 December 2019 в 15:02
поделиться

Если ваши объекты реализуют Serializable, вы можете использовать writeObject () и readObject () для создания глубокой копии. У нас есть иерархия объектов передачи данных и поддержка глубоких копий с помощью этого метода в абстрактном суперклассе (DTO):

/**
 * Reply a deep copy of this DTO.  This generic method works for any DTO subclass:
 * 
 *      Person person = new Person();
 *      Person copy = person.deepCopy();
 * 
 * Note: Using Java serialization is easy, but can be expensive.  Use with care.
 * 
 * @return A deep copy of this DTO.
 */
@SuppressWarnings("unchecked")
public <T extends DTO> T deepCopy()
{
    try
    {
        ObjectOutputStream oos = null;
        ObjectInputStream ois = null;
        try
        {
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            oos = new ObjectOutputStream(bos);
            oos.writeObject(this);
            oos.flush();
            ois = new ObjectInputStream(new ByteArrayInputStream(bos.toByteArray()));
            return (T) ois.readObject();
        }
        finally
        {
            oos.close();
            ois.close();
        }
    }
    catch ( ClassNotFoundException cnfe )
    {
        // Impossible, since both sides deal in the same loaded classes.
        return null;
    }
    catch ( IOException ioe )
    {
        // This has to be "impossible", given that oos and ois wrap a *byte array*.
        return null;
    }
}

(я уверен, что кто-то найдет причину, по которой могут возникать эти исключения .)

Таким же образом можно использовать другие библиотеки сериализации (например, XStream).

2
ответ дан 1 December 2019 в 15:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: