Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Hibernate / JPA: duplicates in child collection

Tags:

hibernate

jpa

My data model is made of Schools and Students. Students have a FK to the School they belong to. I do not understand why the collection contains duplicates, i.e. Joe, Joe, Mary, Mary, Tom, Tom, etc The SQL query generated by Hibernate is correct and does not return duplicates. I could implement a hack to filter out duplicates, but I am not ready to live with a broken window yet ;) I have tried to paste the relevant pieces of code below. Any help greatly appreciated!

// 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;
}
like image 931
Francois Avatar asked Jul 14 '10 15:07

Francois


2 Answers

My guess is that you have a FetchType.EAGER or other mapping in School which will cause an outer join query to be issued by Hibernate, which will result in duplicates in the list.

Switching types to SET works because a set naturally de-dupes based on equality, so the duplicates returned by the outer join query are lost.

A much more thorough explanation by Eran Medan available here:

like image 81
Derek Troy-West Avatar answered Oct 12 '22 15:10

Derek Troy-West


Hard to say from the piece of code but:

  1. Unlike sets, lists typically allow duplicate elements (yes, I noticed you said the query doesn't return duplicates but I wanted to point out that you're maybe not using the right collection type).
  2. Make sure you implement equals/hashCode properly anyway (I suspect a problem at this level).

Actually, can you show the whole mappings? I'm not sure to understand why you have several getters and setters on the same field.

like image 40
Pascal Thivent Avatar answered Oct 12 '22 14:10

Pascal Thivent