2013-12-23 70 views
0

我正在使用JPA 2 + Hibernate 4.2.6的Java项目,我收到了一个奇怪的行为。重复OneToMany注释列表

在我的模型,我有两个相关的entites: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; 

    // ... 
} 

这完美的作品:与某个Question所有Answer s的正确加载。

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

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

注意我需要改变SetList因为我需要保持大约答案和可能的顺序信息,要改变这种秩序。

回答

2

你很可能会得到重复的,因为当使用fetch = FetchType.EAGER,休眠uses an outer join来获取连接表中的数据。

尝试删除渴望的提取来确认。如果是这种情况,您应该删除预先提取,保留一个Set而不是List,或者编写一个JPQL查询来检索您需要的内容。

Hibernate doc

的建议报告的方法是使用在所有静态取 定义懒惰,通过JP-QL动态覆盖此选择。

+0

您还可以使用@Fetch(FetchMode.SELECT)和fetch = FetchType.EAGER。有了这个,不需要从List更改为Set。 – nimo23