Неправильное понимание @DynamicUpdate

Java

Сначала посмотрите на доказательства


Без лишних слов сначала представьте официальный API-документ @DynamicUpdate (как показано ниже), см. https://docs.jboss.org/hibernate/stable/orm/javadocs/

В переводе на народный язык:

  • Для обновлений следует указать, должен ли этот объект ссылаться только на измененные столбцы в подготовленных операторах sql при создании с использованием динамического sql.
  • Обратите внимание, что для повторного присоединения отсоединенных сущностей это невозможно сделать без включенного выбора перед обновлением.

поднять каштаны


Сначала объясните, что аннотация @DynamicUpdate используется в классах сущностей.

Существует таблица базы данных tbl_foo и соответствующий класс сущности Foo, как показано ниже:

id name col3 col4 col5
1 Пикассо 1770 Австрия мужчина
class Foo{
    private Integer id;
    private String name;
    private String col3;
    private String col4;
    private String col5;
    getter...
    setter...
}

Обновите атрибут имени записи id=1 в Сервисе, код выглядит следующим образом:

Foo foo = fooDao.findById(1);
foo.setName("贝多芬");
fooDao.save(foo);

Два случая:

  1. Если аннотация @DynamicUpdate не используется в классе сущностей или используется @DynamicUpdate(false), то базовый SQL, выполняемый Hibernate, выглядит следующим образом:
update tbl_foo set name=?, col3=?, col4=?, col5=? where id=?
  1. Аннотация @DynamicUpdate (или @DynamicUpdate(true)) используется в классе сущностей, а sql, выполняемый Hibernate внизу, выглядит следующим образом:
update tbl_foo set name=? where id=?

Приведенные выше два случая эквивалентны результату обновления базы данных, но используют производительность @Dynamicupdate. Потому что не используя @Dynamicupdate, даже если нет изменений, он будет обновлен. Если вы часто выполняете операции обновления и каждый раз обновляете только несколько полей, @Dynamicupdate по-прежнему хорош для оптимизации производительности.

непонимание


У нас часто есть требование, чтобы веб-уровень использовал объект для получения значения свойства, которое будет изменено внешним интерфейсом (значение, которое не изменено, пусто).Мы надеемся напрямую вызвать метод обновления dao для выбора и обновления.

Веб-слой использует объект для получения значения свойства, которое должно быть изменено внешним интерфейсом, что можно рассматривать как выполнение следующего кода:

Foo foo = new Foo();
foo.setId(1);
foo.setName("贝多芬");

В настоящее время сервисный уровень напрямую использует этот объект для обновления.

fooDao.update(foo);

Ожидаемые результаты:

id name col3 col4 col5
1 Бетховен 1770 Австрия мужчина

Я видел несколько статей в Интернете о том, что добавление @DynamicUpdate в класс сущности может удовлетворить наши вышеуказанные потребности, но, к сожалению, иначе!

Вместо этого результат:

id name col3 col4 col5
1 Бетховен

Если вы полностью понимаете описание @DynamicUpdat в API-документе, легко понять причину такого результата. Смысл динамического обновления @DynamicUpdate заключается в сравнении значения поля в классе сущностей, которое будет использоваться для обновления, со значением поля, запрошенным из базы данных, чтобы определить, было ли оно изменено. Глядя на этот пример, все поля записи с id=1 в базе данных ненулевые, но только имя имеет значение в классе сущности, то есть все поля изменились, но другие поля были обновлены до новых нулевые значения.

сплетни (некоторые глупости можно игнорировать)


  • Чтобы узнать, как использовать аннотацию (или класс), независимо от того, является ли она открытой или коммерческой, самый простой, надежный и прямой способ — использовать официальную документацию по API.

  • Некоторые младшие братья используют @DynamicUpdate при использовании Spring Data JPA, поэтому они думают, что это семья со Spring, но это не так. На самом деле, это видно из названия пакета при обращении к аннотации, очевидно, что Hibernate является его оригинальным соответствием. Причина, конечно, в том, что реализация ORM, используемая Spring Data JPA, — это Hibernate. Таким образом, объясняется, что документ на приведенном выше рисунке является документом API Hibernate, а не документом API Spring или Java.

Все вышеизложенное является моим личным мнением, надеюсь, оно вам поможет. Мой уровень ограничен, неизбежно, что есть неуместные или ошибочные, я надеюсь, вы можете указать. Если у вас есть другие вопросы, пожалуйста, свяжитесь с нами!