使用JPA动态更新

q7solyqu  于 2022-11-14  发布在  其他
关注(0)|答案(3)|浏览(134)

最近我很惊讶地了解到,如果只进行了一次更改并调用了merge,则默认的休眠行为是更新对象中的所有字段。
动态更新字段允许您配置仅更新已更改字段的替代方法...
http://www.mkyong.com/hibernate/hibernate-dynamic-update-attribute-example/
我在Hibernate中使用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;
}

如有任何帮助,我们将不胜感激。

jxct1oxe

jxct1oxe1#

一些问题对您有帮助:

  • getUser()方法是如何工作的?
  • 你不用分离的物体吗?
  • 关联的记录实际上是否已从数据库完全加载?

分离的对象不与任何原始版本相关联,这就是单词 detached 的由来。这有助于Hibernate进行任何比较,从而强制它进行完全升级。
正如我在Springsource Forum上看到的,只有当select-before-update选项被设置为true时,它才能工作,这看起来很合乎逻辑,因为Hibernate必须现在实际上改变了什么。select-before-update选项强制它读取原始文件。
如果您的应用程序完全从数据库中读取User,并且不处理分离的对象,那么我无法提供更多的帮助...

ngynwnxp

ngynwnxp2#

从休眠文档中:
一定要导入@javax.persistence.Entity来标记一个类为实体。

oyxsuwqo

oyxsuwqo3#

你通过调用merger()重新附加一个分离的对象。在这种情况下,你必须打开selectBeforeUpdate。这在javadocs中。

相关问题