我的项目中有以下实体:


AccountGroup
AccountItem
AccountSegment


具有以下关系:


AccountGroup具有List<AccountItem>
AccountItem拥有List<AccountSegment>


而且一切正常。

当我将上一个关系更改为:


AccountItem具有Set<AccountSegment>


从数据库读取的AccountGroup对象看起来很奇怪。如果给定的AccountItem具有三个AccountSegment,那么我在AccountItem中具有三个相同的AccountGroup

调试器的一枪可能比我能更好地说明:


如您所见,accountMapperItems列表具有四个位置,而不是两个。第一对是重复的,每个都有相同的变量。 (第二个类似,没有显示在屏幕截图上)。

下面我粘贴实体代码片段:

class AccountGroup {
    ...
    @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, orphanRemoval = true, mappedBy = "group")
    private List<AccountItem> accountMapperItems;
    ....
}

class AccountItem {
    ...
    @ManyToMany(fetch = FetchType.EAGER, cascade = { CascadeType.REFRESH, CascadeType.MERGE })
    @JoinTable(
        joinColumns={@JoinColumn(name="ACCOUNT_ITEM_ID", referencedColumnName="ID")},
        inverseJoinColumns={@JoinColumn(name="SEGMENT_ID", referencedColumnName="ID")})
    private Set<Segment> segmentSet;

    @ManyToOne
    private AccountGroup group;
    ...
}


AccountSegment没有任何链接。

有谁知道为什么要检索accountMapperItems每个AccountSegment列出一个职位?

问题是在joinable中没有重复的条目!我仔细检查了一下。

更新资料

@Fetch (FetchMode.SELECT)


解决了这个问题,答案中提到的帖子中提供了进一步的解释。

最佳答案

确保所有实体都实现hashCode()equals()。这些方法被某些集合(如Set)用来唯一标识元素。

编辑:如果那不能解决问题,那么我认为重复很可能是由FetchType.EAGER引起的。 This answer很好地解释了。尝试删除FetchType.EAGER看看是否有任何区别。

09-04 19:44