java - 如何从集合中删除和添加值
问题描述
考虑以下实体:
@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
尚未删除。
我错过了什么?
解决方案
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