JPA返回同一实体的多次(双向OneToMany)

时间:2017-05-19 08:02:11

标签: java jpa persistence

我对这样一个直截了当的主题有疑问(我认为这不是一个问题,但实际上DB / persistens不是我最喜欢的一个)。

考虑以下类:

Class Parent {
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "parent", fetch = FetchType.EAGER, orphanRemoval = true)
    public List<Child> getChilds() {..}
}

Class Child {

    @ManyToOne
    public getParent(){..}

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "child", fetch = FetchType.EAGER, orphanRemoval = true)
    public List<GrandChild> getGrandChilds() {..}
}

Class GrandChild {

    @ManyToOne
    public getChild(){..}
}

现在在initservice:

Parent p = new Parent();
List<Child> cl = new ArrayList<Child>();

Child c1 = new Child();
c1.setParent(p);
List<GrandChild> gcl1 = new ArrayList<GrandChild>();
c1.setGrandChilds(gcl1);

Child c2 = new Child();
c2.setParent(p);
List<GrandChild> gcl2 = new ArrayList<GrandChild>();

GrandChild gc1 = new GrandChild();
gc1.setChild(c2);
gcl2.add(gc1);
GrandChild gc2 = new GrandChild();
gc2.setChild(c2);
gcl2.add(gc2);

c2.setGrandChilds(gcl2);

cl.add(c1);
cl.add(c2);
p.setChilds(cl);
Parent tmp1 = parentDao.save(p);

tmp1 包含2个元素的子列表(c1和c2)

但是如果我从DAO获得父级,那么列表(实际上它是一个包?!)包含3个元素! (c1,c2,c2)

我缺少什么?我是否必须更改孩子的CascadeType,实际上我真的不了解Cascadetypes。

编辑: 在DB中它看起来应该是。

1家长

2名父母1的孩子

有同一个孩子的2个孙子

EDIT2 :删除了不相关的代码行:

gcl2.add(new GrandChild());

0 个答案:

没有答案