【问题标题】:JPA: What is the efficient way of merging detached object?JPA:合并分离对象的有效方法是什么?
【发布时间】:2011-06-20 03:18:33
【问题描述】:

技术:Spring、Hibernate、JSR-303、JQuery
平台:Windows

我正在尝试实现一个简单的更新用例。请看DAO/Service/Controller Source Code Link

Class2 包含许多属性,包括 Class1。 Class2Controller 利用 Spring 创建一个新的 Class2 对象并将 HttpRequest 对象参数绑定到 Class2。然后它调用Service,后者又调用DAO。在 DAO 中,将这个新的 Class2 对象更新到数据库的最有效方法是什么?

选项1:

  • 目前在 DAO 中,我从数据库中检索 Class2 对象。

    Class2 class2Persisted = em.find(Class2.class, class2Request.getId());

  • 使用请求对象的属性更新检索到的对象并提交

    tx.begin();
    class2Persisted.setClass1(class2Request.getClass1());
    em.merge(class2Request);
    tx.commit();
    
  • 以上,我只使用 setClass1 更新一个属性。但是 Class2 中有许多属性需要更新。还有其他有效的方法可以在对象级别而不是在每个属性级别将 class2Persisted 与 class2Request 合并吗?

选项 2

  • 让 Class2Controller 检索 class2Persisted 对象并请求 Spring 绑定参数。

  • 我意识到选项 2 不是一个可行的选项。请参阅我之前遇到的另一个问题link。 Hibernate 将尝试加载关联的对象并抛出 EntityNotFoundException 而我的自定义约束 @IdMustExist 没有机会验证。

如果您有任何其他建议,请提出建议。

【问题讨论】:

  • class2Persisted 和 class2Request 数据库中的底层行是否相同? (例如,它们是否具有相同的唯一 ID)?
  • 一般来说你永远不应该使用合并,使用“扩展持久化上下文”

标签: hibernate jpa spring-mvc


【解决方案1】:

您应该使用 dynamic-update=true 来更新实体/表,它经过高度优化,只会更新值发生变化的列并且不包括所有字段。

你可以使用通过注解驱动的 pojo @org.hibernate.annotations.Entity(dynamicUpdate = true)

和

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-26
    • 1970-01-01
    • 2014-11-24
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多