首页 > 解决方案 > 如何从集合中删除和添加值

问题描述

考虑以下实体:

@Entity
public class MainEntity {
  /*...*/
  @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, mappedBy = "mainEntity")
  private Set<SubEntity> subEntities = new LinkedHashSet<>();
  /*...*/
}

@Entity
@Table(uniqueConstraints = {
  @UniqueConstraint(columnNames = {"foo", "bar"})
})
public class SubEntity {
  /*...*/

  @ManyToOne(optional = false)
  private MainEntity mainEntity;

  @Column(nullable = false)
  private String foo;

   @Column(nullable = false)
  private String bar;
  /*...*/
}

MainEntity我用 1创建一个新SubEntity{foo:"a", bar:"b"}并坚持它。

MainEntity mainEntity = new MainEntity();
SubEntity sub = new SubEntity();
sub.setFoo("a");
sub.setBar("b");
sub.setMainEntity(mainEntity);
mainEntity.setSubEntities(new LinkedHashSet<>(sub));
entityManager.persist(mainEntity);

然后我MainEntity通过删除上面的SubEntity内容并添加一个具有完全相同的 foo 和 bar 的新内容来更新。

我试着再坚持MainEntity一次。

SubEntity anotherSub = new SubEntity();
anotherSub.setFoo("a");
anotherSub.setBar("b");
anotherSub.setMainEntity(mainEntity);
// replace
mainEntity.setSubEntities(new LinkedHashSet<>(Arrays.asList(anotherSub)));
entityManager.persist(mainEntity); // throws org.hibernate.exception.ConstraintViolationException: could not execute statement

我希望SubEntity删除首字母并SubEntity添加新的。

但是,第一个查询是添加新的SubEntity(在删除旧的之前)这不起作用,因为违反了 SQL 唯一约束,因为另一个SubEntity尚未删除。

我错过了什么?

标签: javaspringhibernatejpa

解决方案


ID 酒吧 main_entry_id
1 一个 b 1

如果您有这样的带有唯一 foo 和 bar 的表,首先您必须获取id上一个条目的 并将其设置为当前条目id
例如:

MainEntity mainEntity = new MainEntity();
SubEntity sub = new SubEntity();
sub.setFoo("a");
sub.setBar("b");
sub.setMainEntity(mainEntity);
mainEntity.setSubEntities(new LinkedHashSet<>(sub));
MainEntity mainEntityResult = entityManager.persist(mainEntity);

SubEntity anotherSub = new SubEntity();
anotherSub.setFoo("a");
anotherSub.setBar("b");
anotherSub.setMainEntity(mainEntity);
Long subEntryId = SubEntryService.getIdbyFoo(mainEntityResult.getId()); // create a service to get the id of previous 'subEntity'
anotherSub.setId(subEntryId);

mainEntity.setSubEntities(new LinkedHashSet<>(Arrays.asList(anotherSub)));
entityManager.persist(mainEntity);

这个概念是更新已经存在的条目,我们必须传递上一个条目的 id


推荐阅读