我有两个拥有OneToMany关系的实体
Resource.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和新事务,但是没有任何作用
答案 0 :(得分:0)
我设法通过更新现有集而不是清除所有内容来做到这一点。这样就增加了很多if循环。
根本原因是,子实体没有自动生成的主键,其唯一键基于数据。因此,按照刷新操作顺序,插入操作发生在删除之前。因此我们执行的操作已经具有唯一的标识符(无论执行什么顺序,例如先删除,然后插入)。
两种解决方案 1)添加一个主键(新添加的实体会有所不同) 要么 2)更新现有的子实体(不添加新的子实体)