JPA单向ManyToMany - 检索列表时的重复位置

时间:2014-02-10 15:59:18

标签: java hibernate jpa many-to-many

我的项目中有以下实体:

  • AccountGroup
  • AccountItem
  • AccountSegment

以下关系:

  • AccountGroupList<AccountItem>

  • AccountItem List<AccountSegment>

一切正常。

当我将最后一个关系更改为:

  • AccountItemSet<AccountSegment>
从数据库读取的

AccountGroup对象看起来很奇怪。如果给定的AccountItem有三个AccountSegment s,那么我在AccountItem中有三个相同的AccountGroup

来自调试器的镜头可能比我能说得更好: SS from debugger

如您所见,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列出一个位置?

问题不在于连接表中的重复条目!我仔细检查过它。

更新

@Fetch (FetchMode.SELECT)

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

1 个答案:

答案 0 :(得分:3)

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

修改:如果不能解决问题,那么我认为重复项很可能是由FetchType.EAGER引起的。 This answer解释得很清楚。请尝试删除FetchType.EAGER以查看它是否有所不同。