клонирование существующего объекта с новым первичным ключом - PullRequest
1 голос
/ 19 сентября 2011

У меня есть 2 объекта следующим образом

class A{
 Set<B>  bs ;

}

class B{
 A a;

}

Теперь я хочу найти A с идентификатором 1 и вставить новую запись с идентификатором 2, все остальные значения будут такими же. Также B s, связанные с A, должны быть заново вставлены.

Например, если начальный A с идентификатором 1 и который связан с 5 B s, то после выполнения моего кода я хочу 2 A s с id = 1 и 2 и 10 B с (5 для А1 и 5 для А2).

Я попробовал следующее:

    stat tx
    A a= Find A with id a 
    make a transient 
    a.setId(null) ;  As id is auto incremnt
    persist A
    commit tx

Получаю исключение как

Найдены два представления одной коллекции Б.

Я думаю, это потому что B sfected имеет тот же старый идентификатор A при вставке

Примечание: Я использую файлы HBM, а не JPA.

Ответы [ 4 ]

1 голос
/ 19 сентября 2011

Это правильно, потому что вы не можете иметь 2 дублирующихся объекта в одном сеансе.

Пожалуйста, отсоедините объект и сохраните его, в противном случае используйте объединение.

Подробнее об объединении можно прочитать здесь:

http://www.hibernate -training-guide.com / merge.html

1 голос
/ 19 сентября 2011

Предполагая, что ни одно из свойств B s не нуждается в уникальности, вы должны отсоединить все B объекты (возможно, те будут отсоединены, когда вы отсоедините A) и изменить значение A вкаждому объекту B - назначить отдельный A.

0 голосов
/ 19 сентября 2011

Вот мое мнение об этом.

  1. Идентификация объекта в JVM не совпадает с его идентификацией в базе данных.Проверьте эту ссылку ..
  2. Даже если вы изменили первичный ключ, ссылка на объект остается прежней.Таким образом, кэш сеанса не может иметь ссылку на объект, который у него уже есть (даже если вы изменили его идентификатор).
  3. Вам потребуется создать новый объект (временный) для достижения того, что вы пытаетесьделай ИЛИ не позволяй Hibernate управлять твоей личностью.Сделай это сам.Проверьте ранее упомянутую ссылку .

Также проверьте эту ссылку переходное постоянство .Это может помочь вам.

0 голосов
/ 19 сентября 2011

Я бы использовал BeanUtils.copyProperties(..) для дублирования сущности.Затем установите идентификатор в ноль, конечно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...