【问题标题】:JPA - update more fields on entity properlyJPA - 正确更新实体上的更多字段
【发布时间】:2018-09-04 15:48:22
【问题描述】:

我想对托管 JPA 实体的许多字段进行简单更新。 首先我查询我要更新的实体:

MyEntity managedEntity = entityManager.createQuery(query).getSingleResult();

然后我需要使用不受 JPA 管理的新“MyEntity”对象更新此实体:

MyEntity notManagedEntity = new MyEntity();

当然可以从 notManagedEntity 中读取每个字段并将它们设置为进行更新的 managedEntity。

但是有没有更优雅的方式来更新托管实体,而无需逐个获取和设置每个字段?

【问题讨论】:

  • Then I need to update this entity with a new "MyEntity" object which is not managed by JPA 有什么理由吗?
  • 您是否尝试将notManagedEntity 上的id 字段设置为managedEntity 的id,然后在notManagedEntity 上调用update
  • @Yserbius 的意思是您不需要获取和设置每个字段。您只需要对主键或 id 字段执行此操作。这是无法避免的。
  • @XtremeBaumer 因为必须从 csv 创建和映射“notManagedEntity”,然后将其持久化到数据库中。但是,如果 notManagedEntity.equals(managedEntity) jpa 应该进行更新。 “equals”方法已经设置好,不依赖主键。
  • 如果目的只是为了消除从notManagedEntitymanagedEntity的手动复制字段,您可以查看commons.apache.org/proper/commons-beanutils/apidocs/org/apache/…它负责自动填充字段。

标签: java hibernate jpa


【解决方案1】:

AFAIK,更改对托管实体的引用不是一个好主意,因为持久性上下文仍将引用旧实体,因此任何刷新都会触发异常......在处理复杂实体时更为重要持有集合或多对一引用。

相关话题:What is the best way to update the entity in JPA

【讨论】:

  • 谢谢,答案建议在这里设置要更新的属性,让 JPA 进行更新。这是我想避免的,因为我需要更新 30 个属性,我的问题是是否有“更好”的方法来做到这一点。但如果没有,我会这样做。
  • 当然。我最终构建了一个从 DTO 对象执行此操作的工具,因为这是我发现避免任何类型的 PersistenceException 或等效项的唯一方法,尤其是对于大型或复杂对象...
【解决方案2】:

我建议阅读以下问题: Copy all values from fields in one class to another through reflection

这看起来像是您问题的答案。然后,您必须创建从

获得的实体的副本
MyEntity managedEntity = entityManager.createQuery(query).getSingleResult();

创建 java 对象的副本后,您必须为实体的标识符设置一个新值,然后再次将此新对象插入到持久层。

从设计的角度来看,它看起来有点混乱,但如果这是请求,至少从技术角度来看它应该可以工作。

【讨论】:

    猜你喜欢
    • 2018-08-24
    • 1970-01-01
    • 2011-03-29
    • 2012-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-09
    相关资源
    最近更新 更多