Выбор ответа Senior Hibernate: N+1, lazy, кеш обновлено
equals и hashCode сущности
Вопрос
Сущность с @Id @GeneratedValue Long id реализует equals/hashCode по id. Новую сущность положили в HashSet, затем сохранили. Что не так?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: До persist id равен null, потом хеш меняется, объект теряется. Хеш вычислен при id = null, после persist id появился, и объект лежит в «чужой» корзине.
Варианты ответа
- Ничего: это рекомендованный подход для всех сущностей
- До persist id равен null, потом хеш меняется, объект теряетсяправильный ответ
- Hibernate запрещает переопределять equals и hashCode у сущностей с @Id
- hashCode по id вызывает лишний SELECT при каждом вызове
Разбор
Хеш вычислен при id = null, после persist id появился, и объект лежит в «чужой» корзине. Рекомендуемые варианты: equals по натуральному ключу (например, email или номер), либо по id с постоянным hashCode (getClass().hashCode()) и проверкой id != null в equals. Запрета нет, лишних запросов hashCode не делает.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.