Учитывая следующий сценарий:
@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 по-прежнему устарели. Повторяю:
Как это можно решить? Я ожидал бы, что либо менеджеры сущностей обновят свой контекст постоянства автоматически, либо сделают каскадную аннотацию доступной в @JoinColumn, но, похоже, здесь ничего не происходит.
РЕДАКТИРОВАТЬ: Похоже, проблема заключается в том, что bList объекта C не обновляется при обновлении bList объекта A (и, следовательно, не может каскадировать изменения). Я понятия не имею, почему ...Тем не менее обратите внимание, что я говорю о контексте устойчивости, а не о созданных объектах.