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