在OneToMany注释列表中重复

dav*_*ooh 2 java collections hibernate jpa one-to-many

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

在我的模型中,我有两个相关的参与者:QuestionAnswer

@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;

    // ...
}
Run Code Online (Sandbox Code Playgroud)

这很有效:所有Answer与某个相关的Question都正确加载.

但现在我需要改变answers收集的Set方式List.我改变了类型并再次运行应用程序,现在我得到了几个重复answers...为什么可能?我知道List允许重复,但我的数据库中没有重复的记录,为什么我得到这些?

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

注:我需要改变SetList,因为我需要保持有关信息以便寻找答案,可能的话,要改变这种秩序.

Dav*_*que 7

您最有可能获得重复项,因为在使用fetch = FetchType.EAGER时,Hibernate 使用外部联接来获取连接表中的数据.

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

来自Hibernate doc:

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

  • 您还可以将@Fetch(FetchMode.SELECT)与fetch = FetchType.EAGER一起使用.有了这个,无需从List更改为Set. (6认同)