Hibernate / JPA: дубликаты в детской коллекции - PullRequest
7 голосов
/ 14 июля 2010

Моя модель данных состоит из школ и студентов. У учеников есть FK в Школу, к которой они принадлежат. Я не понимаю, почему коллекция содержит дубликаты, то есть Джо, Джо, Мэри, Мэри, Том, Том и т. Д. SQL-запрос, сгенерированный Hibernate, является правильным и не возвращает дубликатов. Я мог бы реализовать взлом, чтобы отфильтровать дубликаты, но я еще не готов жить с разбитым окном;) Я попытался вставить соответствующие фрагменты кода ниже. Любая помощь с благодарностью!

// 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 ]

14 голосов
/ 20 октября 2011

Я предполагаю, что у вас есть FetchType.EAGER или другое сопоставление в School, которое заставит Hibernate выдать запрос на внешнее соединение, что приведет к дублированию в списке.

Переключение типов в SETработает потому, что набор естественным образом устраняет дублирование на основе равенства, поэтому дубликаты, возвращаемые запросом внешнего соединения, теряются.

Гораздо более полное объяснение Эран Медан доступно здесь

1 голос
/ 14 июля 2010

Трудно сказать по коду, но:

  1. В отличие от наборов, списки обычно допускают дублирование элементов (да, я заметил, что вы сказали, что запрос не возвращает дубликаты, но я хотел отметить, что вы, возможно, не используете правильный тип коллекции).
  2. Убедитесь, что вы правильно внедрили equals / hashCode (я подозреваю, что проблема на этом уровне).

На самом деле, вы можете показать все сопоставления? Я не уверен, что понимаю, почему у вас есть несколько геттеров и сеттеров в одном поле.

0 голосов
/ 15 августа 2012

Я думаю, что вы добавляете в коллекцию вещи, которые уже существуют для этого объекта. Не могу быть уверен, не увидев код, куда вы добавляете вещи в коллекцию учеников Школы, но это было бы моим предположением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...