使用JPA进行动态更新

Bri*_*ian 5 performance hibernate jpa

最近我了解到,如果只进行一次更改并调用merge,则默认的hibernate行为是更新对象中的所有字段.

动态更新是允许您配置仅更新已更改字段的替代方法的字段...

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

我正在使用JPA与hibernate,我试图添加以下内容

@javax.persistence.Entity
@org.hibernate.annotations.Entity(dynamicInsert=true, dynamicUpdate=true) 
Run Code Online (Sandbox Code Playgroud)

到我的班级(之前它只有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);
}
Run Code Online (Sandbox Code Playgroud)

并且update方法执行以下操作:

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

任何帮助将不胜感激.

Chu*_*cky 0

一些可以帮助您的问题:

  • getUser()你的方法如何运作?
  • 你不使用分离的对象吗?
  • 关联的记录实际上是从数据库中完全加载的吗?

分离的对象不与任何原始版本链接,因此是分离这个词的起源。这有助于休眠进行任何比较,从而迫使它进行全面升级。

正如我在Springsource Forum上看到的那样,它仅在该选项select-before-update设置为时才起作用true,这似乎很合乎逻辑,因为 Hibernate 现在已经改变了实际情况。该select-before-update选项强制它阅读原文。

如果您的应用程序User完全从数据库中读取数据并且不使用分离的对象,那么我无法帮助您提供更多想法......