MXStat
MXStat
Введите текст для поиска
Расширенный поиск каналов
  • Вход на сайт
  • Каталог
    Каталог каналов Региональные подборки Поиск каналов
    Добавить канал
  • Рейтинги
    Рейтинг каналов Рейтинг публикаций
    Рейтинги брендов и персон
  • Аналитика
  • Поиск по публикациям
  • Мониторинг Max
Java Geek

29 Jul, 10:08

Открыть в Max Поделиться

🚀 Hibernate: Эффективное обновление с @DynamicUpdate

Часто ли вы задумывались, почему Hibernate при обновлении одного поля в сущности генерирует SQL-запрос, который включает все поля? Это может быть неэффективно, особенно для сущностей с десятками колонок.

Именно здесь на помощь приходит аннотация @DynamicUpdate!

💡 В чем проблема? (Без @DynamicUpdate)

По умолчанию, когда вы вызываете repository.save(entity) для существующей сущности, Hibernate генерирует UPDATE запрос, который устанавливает значения для всех полей, кроме первичного ключа.

// Without @DynamicUpdate
update employee
set
age=?, // даже если только age изменился
first_name=?, //... и это тоже
last_name=?
where
id=?

Если изменилось только age, остальные поля обновляются на те же значения, что были.

✨ Решение: @DynamicUpdate(true)

Если вы добавите @DynamicUpdate к вашей сущности, Hibernate будет генерировать SQL-запрос UPDATE, который включает только те поля, которые были изменены (dirty-checking) с момента загрузки или создания сущности.

Смотрим на код:

@Entity
@DynamicUpdate // ✨ Добавляем эту аннотацию!
public class Employee extends AbstractPersistable<Long> {
@Column
String firstName;

@Column
String lastName;

@Column
Integer age;
// ...
}

// В EmployeeService:
// var entity = employeeRepository.findById(1L).get();
// entity.setAge(22); // Изменили только возраст
// employeeRepository.save(entity);
Сгенерированный SQL:

// With @DynamicUpdate
update employee
set
age=? // ✅ Обновляется ТОЛЬКО измененное поле
where
id=?

⚖️ Когда использовать?

- Используйте, если у вас большие сущности (много колонок) и вы часто обновляете только небольшую часть полей. Это сэкономит трафик и немного ускорит базу данных.
- Имейте в виду, что Hibernate придется динамически строить SQL-запрос при каждом обновлении, что может добавить небольшой оверхед, но обычно выгода от оптимизации SQL его перевешивает.

Сделайте ваш код более чистым и эффективным! 🛠️

P.S. Не путайте с @DynamicInsert, который делает то же самое для INSERT запросов (включает только не-null поля).

118 1
Каталог
Каталог каналов Подборки каналов Поиск каналов Добавить канал
Рейтинги
Рейтинг каналов Max
Контакты
Написать в Max Написать в Telegram Написать на почту
Всякая всячина
Пользовательское соглашение Политика конфиденциальности
Наши каналы
MXStat в Telegram MXStat в Max
Наши боты
MXAuthBot MXAnalyticsBot
Made by TGStat