Hibernate/JPA:在子集合中重复

Fra*_*ois 7 hibernate jpa

我的数据模型由学校和学生组成.学生有FK到他们所属的学校.我不明白为什么集合包含重复项,即Joe,Joe,Mary,Mary,Tom,Tom等.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;
}
Run Code Online (Sandbox Code Playgroud)

Der*_*est 15

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

将类型切换到SET是有效的,因为一个集合基于相等性自然地变量,因此外部联接查询返回的重复项将丢失.

一个更详尽的解释由伊兰棉兰可以在这里:


Pas*_*ent 1

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

  1. 与集合不同,列表通常允许重复元素(是的,我注意到您说查询不会返回重复项,但我想指出您可能没有使用正确的集合类型)。
  2. 无论如何,请确保您正确实施equals/hashCode正确(我怀疑这个级别存在问题)。

实际上,你能展示整个映射吗?我不确定为什么你在同一个字段上有多个 getter 和 setter。