我的项目中有以下实体:
-
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
列出一个位置?
问题不是jointable中的重复条目!我已经仔细检查过了。
更新
@Fetch (FetchMode.SELECT)
解决了这个问题,进一步的解释可以在答案中提到的帖子中找到。
最佳答案
确保您的所有实体都实现了 hashCode()
和 equals()
。一些集合(如 Set)使用这些方法来唯一标识元素。
编辑:如果这不能解决问题,那么我认为重复很可能是由 FetchType.EAGER
引起的。 This answer解释得很好。尝试删除 FetchType.EAGER
以查看它是否有任何不同。
关于java - JPA 单向 ManyToMany - 检索列表时的重复位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21681905/