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