Выбор ответа 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).
Варианты ответа
- Сразу выполнит INSERT через persist, как для любой новой сущности
- Бросит исключение: id должен генерироваться базой данных
- Ничего не сохранит до явного вызова flush вне транзакции
- Вызовет merge: SELECT по id, затем INSERT, раз id не nullправильный ответ
Разбор
SimpleJpaRepository.save проверяет isNew: по умолчанию сущность новая, если id равен null (для примитивов 0). С заполненным UUID вызывается merge, который сначала ищет запись, а потом вставляет. Лишний SELECT на каждую вставку. Исправление: реализовать Persistable<UUID> с флагом новизны или добавить @Version, по которому Spring Data тоже определяет новизну.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.