Hibernate Идемпотент Обновление - PullRequest
2 голосов
/ 27 августа 2011

Я пытался искать это по сети, но тщетно. Есть ли способ использовать Hibernate для выполнения идемпотентного обновления.

Одним из вариантов использования является использование HTTP PUT для обновления определенного поля в базе данных через REST API. Например, если у меня есть база данных со столбцами: Id, Name, Phone, UpdateDate , и я обновляю поле Phone (определенного ) Id ) с одним и тем же значением несколько раз, только мое первое действие должно обновить Phone (а также изменить UpdateDate ). Последующие обновления не должны влиять на запись (и UpdateDate ).

Хотя это может быть реализовано в приложении, сначала получая запись и сравнивая ее с моим входным значением перед выполнением обновления. Мне было интересно, есть ли в Hibernate встроенные функции?

1 Ответ

3 голосов
/ 27 августа 2011

В спящем режиме, если вы получаете объект и пытаетесь изменить одно из его свойств и зафиксировать транзакцию.Hibernate сравнивает новые значения со старыми.Выполняет ОБНОВЛЕНИЕ для всех постоянных свойств объекта , только если новое значение хотя бы одного свойства отличается от старого значения.

Пример:

  1. Найти EntityA по id.Hibernate выдает SELECT для сущности (и любых ленивых сущностей «многие к одному») и запоминает исходные значения.EntityA a = hibernateSession.find(EntityA.class, id);
  2. Установить некоторое свойство для entityA.a.setPhone(newPhoneValue);
  3. Передает транзакцию, вызывая hibernateSession.flush(). Hibernate сравнивает новые значения со старыми значениями.Выпускает ОБНОВЛЕНИЕ для всех постоянных свойств x, если старое и новое значение свойства B различаются.

Выполняет обновление, например: UPDATE entityA set phone=?, name=?, updateDate=? WHERE id=?

Если вы хотите, вы можете использовать dynamic-update и dynamic-insert в отображении.

dynamic-update (необязательно - по умолчанию false): указывает, что должен быть сгенерирован UPDATE SQLво время выполнения и может содержать только те столбцы, значения которых изменились.

dynamic-insert (необязательно - по умолчанию false): указывает, что INSERT SQL должен генерироваться во время выполнения и содержать только столбцы, значения которых не равны NULL.

С динамическим обновлениемпри значении true hibernate выдаст UPDATE без столбца name, поскольку он не изменился.

UPDATE entityA set phone=?, updateDate=? WHERE id=?

...