在OneToMany注释列表中重复

时间:2013-12-23 19:18:16

标签: java hibernate jpa collections 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;

    // ...
}

这非常有效:与某个Answer相关的所有Question都已正确加载。

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

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

注意我需要将Set更改为List,因为我需要保留有关订单的信息以获取答案,并且可能需要更改这个订单。

1 个答案:

答案 0 :(得分:5)

您最有可能获得重复项,因为在使用fetch = FetchType.EAGER时,Hibernate uses an outer join可以获取已连接表中的数据。

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

来自Hibernate doc

  

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