【问题标题】:Merging data with OneToMany relation将数据与 OneToMany 关系合并
【发布时间】:2019-01-10 15:27:59
【问题描述】:

我有两个具有 OneToMany 关系的实体

资源.java

@OneToMany(fetch = FetchType.LAZY, cascade = { CascadeType.ALL}, mappedBy="resource", orphanRemoval = true)
private Set<Skills> skills = new HashSet<Skills>();

另一个实体是 Skills.java

@Id
@ManyToOne(fetch=FetchType.EAGER)
@JoinColumn(name = "RESOURCE_CODE", unique = false, nullable = false, foreignKey = @ForeignKey(name = "fk_resource_primary_skills_map_resource_code"))
@Audited(withModifiedFlag = true, targetAuditMode = RelationTargetAuditMode.NOT_AUDITED, modifiedColumnName = "RESOURCE_CODE_MOD")
private Resource resource;

我会一次性添加/更新/删除资源技能。 为此,我正在尝试清除所有现有技能并添加一套新技能

resourceObject.getSkills().clear();
resourceObject.getSkills().addAll(skills);

添加/删除工作正常。但更新不起作用。 我看到下面的异常

 a different object with the same identifier value was already associated with the session

我尝试了 entityManager.flush 和新事务,但没有任何效果

【问题讨论】:

  • 如何更新技能?
  • 我得到了更新的技能。我清除现有集添加新集

标签: java hibernate jpa jakarta-ee


【解决方案1】:

我设法通过更新现有集合而不是清除所有内容来做到这一点。这增加了很多 if 循环,事情就完成了。

根本原因是子实体没有自动生成的主键,它的唯一键是基于数据的。因此,根据刷新操作顺序,插入发生在删除之前。所以我们所做的操作已经存在唯一标识符(无论我们执行什么顺序,比如先删除,然后插入)。

两种解决方案 1)添加一个主键(对于新添加的实体会有所不同) 或者 2)更新现有的子实体(不添加新的子实体)

【讨论】:

    猜你喜欢
    • 2012-02-28
    • 1970-01-01
    • 2011-11-08
    • 1970-01-01
    • 2015-08-16
    • 2016-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多