Чаще всего merge в Hibernate – это лишний
SELECT. И это не про сохранение, а про перенос состояния detached-объекта в текущий Persistence Context.Эту проблему и пути её решения отдельно обсуждали на докладе в рамках Joker Фёдор и Илья.
Встречается это в типичном флоу:
findById -> setX -> save. Внутри
@Transactional загруженная сущность уже managed, а UPDATE и так уйдет в момент flush. А вот save в Spring Data JPA нередко уходит в merge и может добавить лишние чтение или копирование.Отдельная боль -
CascadeType.MERGE (или ALL): merge проходит по графу связей, растут накладные расходы и потенциальные SQL.Не отходя от кассы 🤓
Конечно же, про подобные и более сдожные темы (
@BatchSize, пагинация без OFFSET, StatelessSession/Bulk API, Soft Delete, multi-tenancy, outbox и т.д.) у нас есть собственный лекториум, где Михаил все расскажет и покажет.📎 Читать на Хабре: https://habr.com/ru/companies/spring_aio/articles/1020426/
