鉴于以下情况:
@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 对象并使用孤儿删除的对象)时,我希望删除所有引用的 B 对象,这与当前注释一样工作。但是,实体管理器似乎不理解位于其缓存中的对象 A 现在失去了一些孩子。如果我有一个 A 的实例,我当然必须手动更新它的 bList,或者做一个新的查询来更新它,但即使是新获取的 A 对象仍然是过时的。重申:
- C 对象被删除。
- 使用 orphanRemoval 将移除级联到 B 对象。
- 实体管理器中缓存的 A 对象中的 bList未更新。
- 手动清除实体管理器缓存使其检索正确更新的对象。
如何解决?我希望实体管理器自动更新其持久性上下文,或者在@JoinColumn 上提供级联注释,但这里似乎都不是这种情况。
编辑:似乎问题在于对象 A 的 bList 更新时对象 C 的 bList 没有得到更新(因此不能级联更改)。我不知道为什么.. 仍然注意我在谈论持久性上下文而不是实例化对象。