OneToMany 带注释列表中的重复项

问题描述 投票:0回答:2

我正在使用 JPA 2 + Hibernate 4.2.6 开发一个 Java 项目,但我遇到了奇怪的行为。

在我的模型中,我有两个相关的实体:

Question
Answer

@Entity
public class Question {
    // ...

    @OneToMany(mappedBy = "question", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    private Set<Answer> answers;

    // ...
}


@Entity
public class Answer {
    // ...

    @ManyToOne(optional = false)
    @JoinColumn(name = "question_id", nullable = false)
    private Question question;

    // ...
}

这工作得很好:与某个

Answer
相关的所有
Question
都已正确加载。

但是现在我需要将

answers
集合的尖端从
Set
更改为
List
。我更改了类型并再次运行应用程序,现在我在
answers
中得到了几个重复项... 为什么可能呢?我知道
List
允许重复,但我的数据库中没有重复记录,那么为什么我会得到这些?

我在 Hibernate 的早期版本中读到了一些类似的错误,但我希望它们在上一个版本中得到解决......我错了吗?

注意我需要将

Set
更改为
List
,因为我需要保留有关答案的order的信息,并且可能需要更改此顺序。

java hibernate jpa collections one-to-many
2个回答
17
投票

您很可能会得到重复项,因为当使用 fetch=FetchType.EAGER 时,Hibernate 使用外连接来获取连接表中的数据。

尝试删除急切获取以确认。如果是这种情况,您应该删除急切的获取,保留 Set 而不是 List,或者编写 JPQL 查询来准确检索您需要的内容。

来自 Hibernate 文档

推荐的方法是在所有静态获取上使用 LAZY 定义并通过 JP-QL 动态覆盖此选择。


0
投票

我在 @Paramvir Singh 的评论中注意到它后使用了 Set。 它防止了重复记录

public class User  {
  
    @OneToMany(fetch = FetchType.EAGER)
    private Set<Role> roles;
    
}
© www.soinside.com 2019 - 2024. All rights reserved.