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

标签 java hibernate jpa many-to-many

我的项目中有以下实体:

  • AccountGroup
  • AccountItem
  • AccountSegment

具有以下关系:

  • AccountGroupList<AccountItem>

  • AccountItem List<AccountSegment>

一切正常。

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

  • AccountItemSet<AccountSegment>

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

调试器的截图可能比我更清楚: 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 列出一个位置?

问题不是jointable中的重复条目!我已经仔细检查过了。

更新

@Fetch (FetchMode.SELECT)

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

最佳答案

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

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

关于java - JPA 单向 ManyToMany - 检索列表时的重复位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21681905/

相关文章:

Java Spring Hibernate 通信链路故障

java - 使用 --debug 运行 spring 应用程序不会影响我的记录器

java - java smslib 库未收到短信

java - TimeUnit 无法解析符号

mysql - Spring @GeneratedValue 注释不适用于自动增量字段

java - JPA:将日期从一种格式转换为另一种格式

java - Spring从applicationContext获取bean的正确方法

java - hibernate 错误?

java - 在 Hibernate3 中的 saveOrUpdateAll 情况下,具有相同标识符值的不同对象已与 session 关联

java - Spring 启动 + JPA : @Transactional annotation : Roll back is not working