我的项目中有以下实体: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
看看是否有任何区别。