我的项目中有以下实体:
AccountGroup
AccountItem
AccountSegment
以下关系:
AccountGroup
有List<AccountItem>
AccountItem
List<AccountSegment>
一切正常。
当我将最后一个关系更改为:
AccountItem
有Set<AccountSegment>
AccountGroup
对象看起来很奇怪。如果给定的AccountItem
有三个AccountSegment
s,那么我在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
列出一个位置?
问题不在于连接表中的重复条目!我仔细检查过它。
更新
@Fetch (FetchMode.SELECT)
解决了这个案子,答案中提到的帖子有进一步的解释。
答案 0 :(得分:3)
确保您的所有实体都实施hashCode()
和equals()
。某些集合(如集合)使用这些方法来唯一标识元素。
修改:如果不能解决问题,那么我认为重复项很可能是由FetchType.EAGER
引起的。 This answer解释得很清楚。请尝试删除FetchType.EAGER
以查看它是否有所不同。