2010-11-16 3 views
5

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

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

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

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

@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; 
} 

Любая помощь будет очень цениться.

+1

Вы понимаете, что вызов обновления абсолютно не нужен? Hibernate автоматически сохраняет изменения, внесенные на присоединенных объектах в конце транзакции. –

+0

Эй, ты когда-нибудь это решил?У меня такая же проблема –

ответ

0

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

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

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

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

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

0

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

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

+0

Похоже, у плаката были аннотации, поэтому я не думаю, что этот фрагмент документов является релевантным. – sdouglass

0

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

Смежные вопросы