@DynamicUpdate з Spring Data JPA

1. Огляд

Коли ми використовуємо Spring Data JPA з Hibernate, ми також можемо використовувати додаткові функції Hibernate. @DynamicUpdate - одна з таких можливостей.

@DynamicUpdate - це примітка на рівні класу, яку можна застосувати до сутності JPA. Це гарантує, що Hibernate використовує лише модифіковані стовпці в операторі SQL, які він створює для оновлення сутності .

У цій статті ми розглянемо анотацію @DynamicUpdate за допомогою прикладу Spring Data JPA .

2. JPA @Entity

Коли програма запускається, Hibernate генерує оператори SQL для CRUD-операцій усіх сутностей. Ці оператори SQL генеруються один раз і кешуються в пам'яті для підвищення продуктивності.

Сформований оператор оновлення SQL включає всі стовпці сутності. У разі, якщо ми оновлюємо сутність, значення модифікованих стовпців передаються в оператор оновлення SQL. Для стовпців, які не оновлюються, Hibernate використовує існуючі значення для оновлення.

Спробуємо це зрозуміти на прикладі. Спочатку розглянемо сутність JPA з назвою Account :

@Entity public class Account { @Id private int id; @Column private String name; @Column private String type; @Column private boolean active; // Getters and Setters }

Далі напишемо сховище JPA для сутності Account :

@Repository public interface AccountRepository extends JpaRepository { }

Тепер ми будемо використовувати AccountRepository оновити ім'я поля в облікового запису об'єкта:

Account account = accountRepository.findOne(ACCOUNT_ID); account.setName("Test Account"); accountRepository.save(account);

Після виконання цього оновлення ми можемо перевірити згенерований оператор SQL. Сформований оператор SQL включатиме всі стовпці Account :

update Account set active=?, name=?, type=? where id=?

3. JPA @Entity з @DynamicUpdate

Ми бачили, що, хоча ми змінили лише поле імені , Hibernate включив усі стовпці в оператор SQL.

Тепер додамо анотацію @DynamicUpdate до сутності Account :

@Entity @DynamicUpdate public class Account { // Existing data and methods }

Далі, давайте запустимо той самий код оновлення, який ми використовували в попередньому розділі. Ми бачимо, що SQL, згенерований Hibernate, у цьому випадку включає лише стовпець імені :

update Account set name=? where id=?

Отже, що відбувається, коли ми використовуємо @DynamicUpdate для сутності ?

Насправді, коли ми використовуємо @DynamicUpdate для сутності, Hibernate не використовує кешований оператор SQL для оновлення. Натомість він буде генерувати оператор SQL кожного разу, коли ми оновлюємо сутність. Це генерується SQL включає в себе тільки змінені стовпці .

Для того, щоб виявити змінені стовпці, Hibernate потрібно відстежувати стан поточної сутності. Отже, коли ми змінюємо будь-яке поле сутності, воно порівнює поточний та змінений стан сутності.

Це означає, що з @ DynamicUpdate пов'язані накладні витрати на продуктивність . Тому ми повинні використовувати його лише тоді, коли це насправді потрібно.

Безумовно, є кілька сценаріїв, коли нам слід використовувати цю анотацію - наприклад, якщо сутність представляє таблицю, яка має велику кількість стовпців, і лише деякі з цих стовпців потрібно часто оновлювати. Крім того, коли ми використовуємо менш версійне оптимістичне блокування, нам потрібно використовувати @DynamicUpdate .

4. Висновок

У цьому підручнику ми розглянули анотацію @DynamicUpdate Hibernate. Ми використовували приклад Spring Data JPA, щоб побачити @DynamicUpdate в дії. Крім того, ми обговорювали, коли нам слід використовувати цю функцію, а коли ні.

Як завжди, повні приклади коду, використані в цьому посібнику, доступні на Github.