Динамическое обновление с JPA - PullRequest
5 голосов
/ 16 ноября 2010

Я был удивлен, когда недавно узнал, что режим гибернации по умолчанию обновляет все поля в объекте, если сделано только одно изменение и вызвано слияние.

Динамическое обновление - это поле, которое позволяет вам настроить альтернативный подход - просто обновить измененное поле ...

http://www.mkyong.com/hibernate/hibernate-dynamic-update-attribute-example/

Я использую JPA с Hibernate, и я попытался добавить следующее

@javax.persistence.Entity
@org.hibernate.annotations.Entity(dynamicInsert=true, dynamicUpdate=true) 

для моего класса (ранее у него была только аннотация JPA)

В любом случае, я отслеживал sql, и, к сожалению, он не изменился, и я все еще вижу, как обновляются все поля.

Это моя Java, которая обновляет объект ...

    @Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW)    
public void setAccountStatusForUser(String username, AccountStatus act){
    User u = this.getUser(username);
    u.setAccountStatus(act);
    this.update(u);
}

и метод обновления выполняет следующие действия:

    @Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW)
  public Object update(Object o) {
      Object a = this.entityManager.merge(o);
      this.entityManager.flush();
      return a;
}

Любая помощь будет принята с благодарностью.

Ответы [ 3 ]

0 голосов
/ 20 декабря 2011

Из документации по спящему режиму:

Обязательно импортируйте @ javax.persistence.Entity, чтобы пометить класс как сущность. Это обычная ошибка при импорте @ org.hibernate.annotations.Entity случайно.

0 голосов
/ 05 марта 2015

Вы присоединяете отсоединенный объект через вызов merger ().В этом случае вы должны включить selectBeforeUpdate.Это в ага.

0 голосов
/ 04 ноября 2011

Несколько вопросов, чтобы помочь вам:

  • Как работает ваш getUser() метод?
  • Разве вы не используете отдельные объекты?
  • Связанная запись фактически полностью загружена из базы данных?

Отдельные объекты не связаны ни с какой оригинальной версией, поэтому происхождение слова detached . Это помогает hibernate от любого сравнения, что заставляет его делать полное обновление.

Как я видел на Springsource Forum , он работает только тогда, когда опция select-before-update установлена ​​на true, что кажется вполне логичным, поскольку Hibernate теперь должен изменить то, что фактически изменилось. Опция select-before-update заставляет его прочитать оригинал.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...