【问题标题】:Dynamic-update with JPA使用 JPA 进行动态更新
【发布时间】:2010-11-16 17:13:37
【问题描述】:

我很惊讶最近得知默认休眠行为是更新对象中的所有字段,如果只进行一次更改并调用合并。

Dynamic-update 是允许您配置仅更新已更改字段的替代方法的字段...

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

任何帮助将不胜感激。

【问题讨论】:

  • 你知道调用 update 是完全没有必要的吗? Hibernate 会在事务结束时自动持久化对附加实体所做的更改。
  • 嘿,你有没有解决这个问题?我有同样的问题

标签: performance hibernate jpa


【解决方案1】:

一些问题可以帮助你:

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

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

正如我在Springsource Forum 上看到的,它仅在选项select-before-update 设置为true 时才有效,这似乎很合乎逻辑,因为Hibernate 现在必须知道实际发生的变化。 select-before-update 选项强制它阅读原文。

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

【讨论】:

    【解决方案2】:

    来自休眠文档:

    确保导入@javax.persistence.Entity 以将类标记为实体。意外导入@org.hibernate.annotations.Entity 是一个常见错误。

    【讨论】:

    • 看起来海报有两个注释,所以我认为文档的 sn-p 不相关。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-13
      • 2022-06-23
      • 1970-01-01
      • 2019-05-02
      • 1970-01-01
      • 2011-05-03
      相关资源
      最近更新 更多