Spring Data JPA - 在显式子删除后加载父级返回已删除子级的子级的集合

时间:2013-05-19 00:59:49

标签: java spring spring-data spring-data-jpa

我有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记录在控制台中),但它们返回不同的结果......

1 个答案:

答案 0 :(得分:1)

您的ManyToOne是EAGER(默认情况下)。你的OneToMany也是EAGER(你明确地标记了它)。因此,当您在第一行代码中生成子代时,JPA还会加载其父代,以及父代的所有子代。

然后你删除了孩子,但你没有从父母的孩子那里删除它。由于已经加载了父项的子集合,因此已删除的子项仍在集合中。