Выбор ответа Senior Hibernate: N+1, lazy, кеш обновлено

equals и hashCode сущности

Вопрос

Сущность с @Id @GeneratedValue Long id реализует equals/hashCode по id. Новую сущность положили в HashSet, затем сохранили. Что не так?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: До persist id равен null, потом хеш меняется, объект теряется. Хеш вычислен при id = null, после persist id появился, и объект лежит в «чужой» корзине.

Варианты ответа

  1. Ничего: это рекомендованный подход для всех сущностей
  2. До persist id равен null, потом хеш меняется, объект теряетсяправильный ответ
  3. Hibernate запрещает переопределять equals и hashCode у сущностей с @Id
  4. hashCode по id вызывает лишний SELECT при каждом вызове

Разбор

Хеш вычислен при id = null, после persist id появился, и объект лежит в «чужой» корзине. Рекомендуемые варианты: equals по натуральному ключу (например, email или номер), либо по id с постоянным hashCode (getClass().hashCode()) и проверкой id != null в equals. Запрета нет, лишних запросов hashCode не делает.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.