鉴于以下情况:
@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;
}
Run Code Online (Sandbox Code Playgroud)
换句话说:对象A和对象C都包含许多B对象.
当我删除一个C对象时(从技术上讲,我正在更新一个包含多个C对象并使用orphanremoval的对象),我希望删除所有引用的B对象,它们按照预期的方式使用当前注释.但是,实体管理器似乎并不理解位于其缓存中的对象A现在已经丢失了一些孩子.如果我有一个A的实例,我当然必须手动更新它的bList,或者做一个新的查询来更新它,但即使是新获取的A对象仍然过时.重申:
怎么解决这个问题?我希望实体管理器能够自动更新其持久化上下文,或者在@JoinColumn上提供级联注释,但在这里似乎都不是这种情况.
编辑:似乎问题在于对象C的bList在对象A的bList更新时没有得到更新(因此不能级联更改).我不知道为什么虽然..仍然注意到我在谈论持久性上下文而不是实例化对象.