@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 его перевешивает.
Сделайте ваш код более чистым и эффективным! 🛠️
❓ А вы используете
@DynamicUpdate в своих проектах? Поделитесь в комментариях! 👇P.S. Не путайте с
@DynamicInsert, который делает то же самое для INSERT запросов (включает только не-null поля).📲 Мы в MAX
👉 @java_geek