Выбор ответа Middle Spring Data JPA обновлено

save с заданным вручную id

Вопрос

Сущность имеет @Id UUID id, который присваивается в конструкторе, поля @Version нет. Что сделает repository.save(new Product(...))?

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

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

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

Коротко

Правильный ответ: Вызовет merge: SELECT по id, затем INSERT, раз id не null. SimpleJpaRepository.save проверяет isNew: по умолчанию сущность новая, если id равен null (для примитивов 0).

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

  1. Сразу выполнит INSERT через persist, как для любой новой сущности
  2. Бросит исключение: id должен генерироваться базой данных
  3. Ничего не сохранит до явного вызова flush вне транзакции
  4. Вызовет merge: SELECT по id, затем INSERT, раз id не nullправильный ответ

Разбор

SimpleJpaRepository.save проверяет isNew: по умолчанию сущность новая, если id равен null (для примитивов 0). С заполненным UUID вызывается merge, который сначала ищет запись, а потом вставляет. Лишний SELECT на каждую вставку. Исправление: реализовать Persistable<UUID> с флагом новизны или добавить @Version, по которому Spring Data тоже определяет новизну.

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

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