Рубрики
Без рубрики

@DynamicUpdate с весенними данными JPA

Узнайте, как использовать @DynamicUpdate с сущностью JPA, чтобы убедиться, что Hibernate использует только измененные столбцы в инструкции SQL для обновления

Автор оригинала: Kamlesh Kumar.

1. Обзор

Когда мы используем Spring Data JPA с Hibernate, мы также можем использовать дополнительные функции Hibernate. @DynamicUpdate является одной из таких функций.

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

В этой статье мы рассмотрим аннотацию @DynamicUpdate с помощью примера Spring Data JPA .

2. JPA @Entity

При запуске приложения Hibernate генерирует инструкции SQL для операций CRUD всех сущностей. Эти операторы SQL генерируются один раз и кэшируются в памяти для повышения производительности.

Сгенерированный оператор обновления SQL включает в себя все столбцы сущности. В случае обновления сущности значения измененных столбцов передаются в инструкцию SQL update. Для столбцов, которые не обновляются, 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 для Учетной записи сущности:

@Repository
public interface AccountRepository extends JpaRepository {
}

Теперь мы будем использовать AccountRepository для обновления поля name объекта Account :

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

Мы видели, что, хотя мы изменили только поле name , Hibernate включил все столбцы в инструкцию SQL.

Теперь давайте добавим аннотацию @DynamicUpdate к сущности Account :

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

Затем давайте запустим тот же код обновления, который мы использовали в предыдущем разделе. Мы видим, что SQL, сгенерированный Hibernate, в данном случае включает только столбец name :

update Account set name=? where id=?

Итак, что происходит, когда мы используем @DynamicUpdate на сущности ?

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

Чтобы узнать об измененных столбцах, Hibernate необходимо отслеживать состояние текущего объекта. Таким образом, когда мы изменяем любое поле сущности, оно сравнивает текущее и измененное состояния сущности.

Это означает, что @ Динамическое обновление имеет связанные с ним накладные расходы на производительность . Поэтому мы должны использовать его только тогда, когда это действительно необходимо.

Конечно, есть несколько сценариев, в которых мы должны использовать эту аннотацию — например, если сущность представляет таблицу с большим количеством столбцов, и только некоторые из этих столбцов должны часто обновляться. Кроме того, когда мы используем менее оптимистичную блокировку версий, нам нужно использовать @DynamicUpdate .

4. Заключение

В этом уроке мы рассмотрели аннотацию @DynamicUpdate Hibernate. Мы использовали пример Spring Data JPA, чтобы увидеть @DynamicUpdate в действии. Кроме того, мы обсудили, когда мы должны использовать эту функцию, а когда нет.

Как всегда, полные примеры кода, используемые в этом руководстве, доступны на Github .