performance - 使用 JPA 进行动态更新

标签 performance hibernate jpa

我最近惊讶地发现,默认的 hibernate 行为是在仅进行单个更改并调用合并时更新对象中的所有字段。

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

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

我在 Hibernate 中使用 JPA,并尝试添加以下内容

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

到我的类(class)(以前它只有 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;
}

任何帮助将不胜感激。

最佳答案

一些可以帮助您的问题:

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

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

    正如我在 Springsource Forum 上看到的那样,它仅在选项 select-before-update 设置为 true 时才有效,这似乎很合乎逻辑,因为 Hibernate 现在必须了解实际更改的内容。 select-before-update 选项强制它阅读原件。

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

    关于performance - 使用 JPA 进行动态更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4196921/

    相关文章:

    python - 如何优化大文件的读取和处理?

    java - 我的数据源设置有什么问题让 Spring Boot 连接到 MySQL?

    ruby - 哪个 Ruby Web 服务器?

    python - 使用两个 numpy 向量中元素对的函数填充矩阵的最快方法?

    java - 将通用 jar 保留在服务器库中,然后将其作为 war 分发的一部分是否更有效?

    java - 从 EclipseLink 切换到 Hibernate

    java - Hibernate 连接表限制

    java - Mysql错误: field 'XXX' doesn't have a default value

    java - 如果两个实体表之间没有关系,如何连接这些表?

    java - 如何在应用程序级别处理行锁争用