Проблема Flush() после слияния сущности

Моя проблема в том, что у меня есть объект A, который содержит список объектов B.

@Entity
class A {

   @OneToMany(cascade={CascadeType.MERGE})
   List<B> list;

}

Когда я делаю «слияние» объекта A, а затем вызываю «flush» внутри метода EJB без сохранения состояния

em.merge(a); //a is of class A
em.flush(); //doesn't flush "list"

на самом деле это не работает. идентификаторы объектов B "списка" не установлены.

Но сохранение и промывка работают

em.persist(a);
em.flush(); // it works!

Идентификаторы объекта B "списка" установлены.

Я использую EclipseLink. Кто-нибудь знает, что может происходить?


person Rodrigo Villalba    schedule 25.06.2010    source источник
comment
Из-за шума в ответах ниже (какие-то друзья?), интересно, вопрос серьезный и пока не получу подтверждение, больше времени на него тратить не буду. Если эти люди — ваши друзья, вы должны их немного просветить.   -  person Pascal Thivent    schedule 26.06.2010
comment
Этот вопрос является своего рода магнитом для спама.   -  person bmargulies    schedule 26.06.2010
comment
@Паскаль, @bmargulies; Очищено и защищено от дальнейших глупостей. Спасибо за флаг.   -  person Bill the Lizard    schedule 26.06.2010


Ответы (1)


arrow_upward
0
arrow_downward

на самом деле это не работает, потому что идентификаторы объектов B, являющихся частью списка «список», не установлены.

Вам следует избегать использования идентификатора для реализации equals/hashCode, контракт не должен изменяться, пока объекты находятся в List. Во всяком случае, я не могу воспроизвести вашу проблему с EclipseLink 2.0: слияние в A каскадирует вставку в B, когда я добавляю B в список.

person Pascal Thivent    schedule 25.06.2010