2

我有父->子双向关系如下...

class Parent{

    @OneToMany(mappedBy="parent", fetch = FetchType.EAGER)
    Collection<Child> children;
}

class Child{
    @ManyToOne
    @JoinColumn(name="PARENT_ID")
    private Parent parent;
}

当我明确删除子项,然后加载其父项(包含所有子项)时,我会在父项的子项集合中获得先前删除的子项... JPA 提供程序是休眠...

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

4

1 回答 1

1

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

然后删除孩子,但不会将其从父母的孩子中删除。并且由于已经加载了父级的子级集合,因此删除的子级仍在集合中。

于 2013-05-19T08:28:59.430 回答