在OneToMany注释列表中重复
我正在使用JPA 2 + Hibernate 4.2.6开发一个Java项目,我得到了一个奇怪的行为。
在我的模型中,我有两个相关的参与者: Question
和Answer
@Entity public class Question { // ... @OneToMany(mappedBy = "question", cascade = CascadeType.ALL, fetch = FetchType.EAGER) private Set answers; // ... } @Entity public class Answer { // ... @ManyToOne(optional = false) @JoinColumn(name = "question_id", nullable = false) private Question question; // ... }
这很有效:所有与某个Question
相关的Answer
都正确加载。
但现在我需要将answers
收集器的Set
从Set
更改为List
。 我改变了类型并再次运行应用程序,现在我得到了几个重复的answers
……为什么可能? 我知道List
允许重复,但我的数据库中没有重复的记录,为什么我得到这些?
我在先前版本的Hibernate中读到了一些类似的错误,但我希望它们在最后一个版本中得到解决…我错了吗?
注意我需要将Set
更改为List
因为我需要保留有关答案顺序的信息,并可能更改此顺序。
您最有可能获得重复项,因为在使用fetch = FetchType.EAGER时,Hibernate 使用外部联接来获取连接表中的数据。
尝试删除急切的提取以确认。 如果是这种情况,您应该删除急切的提取,保留Set而不是List,或者编写JPQL查询以准确检索您需要的内容。
来自Hibernate doc :
推荐的方法是在所有静态提取定义上使用LAZY,并通过JP-QL动态覆盖此选择。