jpa OneToMany注解列表中的重复

62lalag4  于 8个月前  发布在  其他
关注(0)|答案(2)|浏览(74)

我正在使用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;

    // ...
}

这是完美的工作:与某个Question相关的所有Answer都被正确加载。
但是现在我需要将answers集合的类型从Set更改为List。我改变了类型,并再次运行应用程序,现在我得到几个重复的answers.为什么会这样?我知道List允许重复,但我的数据库中没有重复的记录,那么为什么我会得到这些?
我在以前的Hibernate版本中读到过一些类似的bug,但我希望它们在最后一个版本中得到解决。我错了吗?

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

pkmbmrz7

pkmbmrz71#

你很可能会得到重复的数据,因为当使用fetch=FetchType.EAGER时,Hibernate使用一个外部连接来获取连接表中的数据。
尝试删除急切抓取来确认。如果是这种情况,您应该删除即时抓取,保留Set而不是List,或者编写JPQL查询来准确检索您需要的内容。
Hibernate文档:
推荐的方法是在所有静态获取定义上使用LAZY,并通过JP-QL动态覆盖此选择。

roqulrg3

roqulrg32#

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

public class User  {
  
    @OneToMany(fetch = FetchType.EAGER)
    private Set<Role> roles;
    
}

相关问题