我的数据模型由学校和学生组成。学生有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;
}
答案 0 :(得分:14)
我的猜测是你在学校有一个FetchType.EAGER或其他映射,它会导致Hibernate发出外连接查询,这将导致列表中的重复。
将类型切换为SET是有效的,因为一个集合基于相等性自然地进行了重复操作,因此外部联接查询返回的重复项将丢失。
Eran Medan提供here更全面的解释:
答案 1 :(得分:1)
很难从这段代码中说出来,但是:
equals
/ hashCode
(我怀疑此级别存在问题)。实际上,你能展示整个映射吗?我不确定为什么你在同一个领域有几个吸气剂和制定者。
答案 2 :(得分:0)
我认为您正在为该对象已经存在的Collection中添加内容。如果没有看到你在学校的学生系列中添加内容的代码,就无法确定,但那是我的猜测。