Hibernate与OneToMany关系的奇怪行为

时间:2015-05-05 13:05:47

标签: hibernate spring-data

我的代码涉及3个实体:

@Entity
public class Data implements Serializable {
    ...
    @OneToMany(cascade={CascadeType.ALL},fetch = FetchType.EAGER,
               targetEntity = Bit.class,mappedBy = "data")
    private Collection<Bit> bit;    

    @OneToMany(cascade={CascadeType.ALL},fetch = FetchType.EAGER,
               targetEntity = Linked.class,mappedBy = "data")
    private Collection<Linked> linked;
}

@Entity
public class Linked implements Serializable {
    ...
    @EmbeddedId
    private LinkIdPK id;

    @ManyToOne(optional=true,fetch = FetchType.EAGER,targetEntity = Data.class)
    private Data data;
}

@Entity
public class Bit implements Serializable {
    ...
    @EmbeddedId
    private BitIdPK id;

    @MapsId("data")@ManyToOne(optional=true,targetEntity = Data.class)
    private Data data;

我正在使用Spring存储库执行搜索,以获取一个Data实例。我知道我从数据库查询的元素有“3 Bit”元素,数据库中有“1 Linked”元素。

当我遍历Data.bit中的Bit元素时,我找到3个元素,这是正常的。

但是当我遍历Data.linked中的Linked元素时,我找到3个元素,它们指向同一个对象,而我只期待1个元素。

我尝试在数据库中添加1位元素,现在我发现Data.linked中有4个元素指向同一个对象。

这是正常行为吗?这是我的代码中的错误,还是Hibernate中的错误?

2 个答案:

答案 0 :(得分:0)

关于链接到数据的多对一映射的@MapsID丢失。当您使用嵌入式ID时,可能会导致此问题。

此致

普拉萨德

答案 1 :(得分:0)

最后,我从hibernate团队得到了答案。这似乎是一个已知的问题,目前只有一个解决方法,现在: 将注释@Fetch(value = FetchMode.SUBSELECT)添加到其中一个OneToMany集合中。