Связь JPA не обновляется при удалении дочерних элементов

Учитывая следующий сценарий:

@Entity
public class A {
  @OneToMany(mappedBy = "a", cascade = CascadeType.ALL)
  private List<B> bList;
}

@Entity
public class B {
  @ManyToOne()
  @JoinColumn(name = "a_id", referencedColumnName = "id")
  private A a;

  @ManyToOne()
  @JoinColumn(name = "c_id", referencedColumnName = "id")
  private C c;
}

@Entity
public class C {
  @OneToMany(mappedBy="c", cascade=CascadeType.ALL, orphanRemoval=true)
  @CascadeOnDelete // eclipselink specific optimization annotation
  private List<B> bList;
}

Другими словами: и объект A, и объект C содержит несколько объектов B.

Когда я удаляю объект C (технически я обновляю объект, содержащий несколько объектов C и использую функцию orphanremoval), я хочу удалить все упомянутые B-объекты, которые работают должным образом с текущим аннотации. Однако диспетчер сущностей, похоже, не понимает, что объект A, лежащий в его кеше, теперь потерял несколько дочерних элементов. Если бы у меня был экземпляр A, мне, конечно, пришлось бы обновить его bList вручную или выполнить новый запрос чтобы обновить его, но даже недавно выбранные объекты A по-прежнему устарели. Повторяю:

  • объекты C удалены.
  • Удаление выполняется каскадно на объекты B с помощью orphanRemoval.
  • bList in Кэшированные в Entity Manager объекты не обновляются .
  • Ручная очистка кеша диспетчера объектов позволяет получить правильно обновленные объекты.

Как это можно решить? Я ожидал бы, что либо менеджеры сущностей обновят свой контекст постоянства автоматически, либо сделают каскадную аннотацию доступной в @JoinColumn, но, похоже, здесь ничего не происходит.

РЕДАКТИРОВАТЬ: Похоже, проблема заключается в том, что bList объекта C не обновляется при обновлении bList объекта A (и, следовательно, не может каскадировать изменения). Я понятия не имею, почему ...Тем не менее обратите внимание, что я говорю о контексте устойчивости, а не о созданных объектах.

5
задан Rasmus Franke 27 April 2011 в 09:25
поделиться