Hibernate / JPA:在子集合中重复

时间:2010-07-14 15:18:49

标签: hibernate jpa

我的数据模型由学校和学生组成。学生有FK到他们所属的学校。 我不明白为什么这个集合包含重复,即乔,乔,玛丽,玛丽,汤姆,汤姆等 Hibernate生成的SQL查询是正确的,不会返回重复项。 我可以实现一个黑客来过滤重复,但我还没有准备好与一个破碎的窗口生活;) 我试图在下面粘贴相关的代码片段。任何帮助非常感谢!

// SchoolJpa

@OneToMany (
    mappedBy = "school",
    targetEntity = StudentJpa.class,
    fetch = FetchType.LAZY,
    cascade = CascadeType.ALL
)
@Override
public List<Student> getStudentsInternal() {
    return super.getStudentsInternal();
}

// SchoolImpl

private List<Student> students = new ArrayList<Student>();

public List<Student> getStudents() {
    return Collections.unmodifiableList(students);
}

public List<Student> getStudentsInternal() {
    return students;
}

public void setStudentsInternal(List<Students> students) {
    this.students = students;
}

3 个答案:

答案 0 :(得分:14)

我的猜测是你在学校有一个FetchType.EAGER或其他映射,它会导致Hibernate发出外连接查询,这将导致列表中的重复。

将类型切换为SET是有效的,因为一个集合基于相等性自然地进行了重复操作,因此外部联接查询返回的重复项将丢失。

Eran Medan提供here更全面的解释:

答案 1 :(得分:1)

很难从这段代码中说出来,但是:

  1. 与集合不同,列表通常允许重复元素(是的,我注意到你说查询没有返回重复项,但我想指出你可能没有使用正确的集合类型)。
  2. 确保无论如何都要正确实施equals / hashCode(我怀疑此级别存在问题)。
  3. 实际上,你能展示整个映射吗?我不确定为什么你在同一个领域有几个吸气剂和制定者。

答案 2 :(得分:0)

我认为您正在为该对象已经存在的Collection中添加内容。如果没有看到你在学校的学生系列中添加内容的代码,就无法确定,但那是我的猜测。