我有Parent-> Child双向关系如下......
class Parent{
@OneToMany(mappedBy="parent", fetch = FetchType.EAGER)
Collection<Child> children;
}
class Child{
@ManyToOne
@JoinColumn(name="PARENT_ID")
private Parent parent;
}
当我明确删除子项时,并在其后加载其父项(包含所有子项)我之前删除了父项的子集合中的子项... JPA提供程序是Hibernate ...
Child child= childRepo.findOne(CHILD_ID);
childRepo.delete(child);
childRepo.flush();
// next, returns collection without deleted child
Collection<Child> children= childRepo.findAll();
Parent parent = parentRepo.findById(PARENT_ID);
/// next, returns collection including deleted child
Collection<Child> parentChildren = parent.getChildren();
我不明白是什么问题?每个find *方法都执行select(在列表中,那些SELECT记录在控制台中),但它们返回不同的结果......
答案 0 :(得分:1)
您的ManyToOne是EAGER(默认情况下)。你的OneToMany也是EAGER(你明确地标记了它)。因此,当您在第一行代码中生成子代时,JPA还会加载其父代,以及父代的所有子代。
然后你删除了孩子,但你没有从父母的孩子那里删除它。由于已经加载了父项的子集合,因此已删除的子项仍在集合中。