来自具有 OneToMany 关系的 Hibernate 的奇怪行为

Strange behaviour from Hibernate with OneToMany relationship

我的代码涉及 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 存储库执行搜索以获取数据的一个实例。我知道我从数据库中查询的元素在数据库中有“3 位”元素和“1 个链接”元素。

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

但是当我遍历 Data.linked 中的链接元素时,我发现了 3 个指向同一个对象的元素,而我只期望有 1 个元素。

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

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

@MapsID 在链接到数据的多对一映射上 missing.It 可能是您使用嵌入式 ID 时导致问题的原因。

此致,

普拉萨德

终于得到hibernate团队的答复。这似乎是一个已知问题,目前只有一个解决方法: 将注释 @Fetch(value = FetchMode.SUBSELECT) 添加到 OneToMany 集合之一。