我的代码涉及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中的错误?
答案 0 :(得分:0)
关于链接到数据的多对一映射的@MapsID丢失。当您使用嵌入式ID时,可能会导致此问题。
此致
普拉萨德
答案 1 :(得分:0)
最后,我从hibernate团队得到了答案。这似乎是一个已知的问题,目前只有一个解决方法,现在:
将注释@Fetch(value = FetchMode.SUBSELECT)
添加到其中一个OneToMany
集合中。