Проблема 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)


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

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

person Pascal Thivent    schedule 25.06.2010