在带有spring data-jpa的spring启动应用程序中,我们使用hibernate实现
当我们有一个包含Child列表的Parent实体(一对多和cascade.all)时,我们使用d来保存什么策略?
我们必须循环子,与dto比较,如果有现有元素,更新值,如果它们是新的,添加元素,如果已删除某些元素,将其从列表中删除?
实施例
Parent parent = repo.findById(Integer id);
//remove items who dont exit anymore
Childs childs = bean.getChild();
for (Iterator<Childs> iterator = childs.iterator(); iterator.hasNext();) {
//compare with dto...
}
for (ChildsDto childsDto : ChildsDto) {
if(childsDto==null){
//add new element in the list of childs of parent
}else{
update element in the list of childs of parent
}
}
答案 0 :(得分:1)
只要 childsDto 包含ID,您就可以将它们设置为 Childs 列表,然后将列表设置为 parent 。
例如:
List<Childs> childsFromDto = new ArrayList();
for (ChildsDto childsDto : ChildsDto) {
if(childsDto==null){
//add new element in the list of childs of parent
Childs child = new Childs();
child.setId(childsDto.getId());
....
childsFromDto.add(child);
}
parent.setChilds(childsFromDto);
通过保存父级,列表将根据需要合并。
如果您想删除不再拥有父母的孩子,您可以将orphanRemoval添加到 Parent 中的关系中,如下所示:
@OneToMany(mappedBy=..., orphanRemoval="true")
Collection<Childs> childs;
答案 1 :(得分:1)
您可以通过两种基本方法从DTO
列表中过滤掉重复项。
第一种方式
遍历您的DTO
列表并过滤掉重复项
第二种方式
在您的Set
实体中将儿童作文设为Parent
,如此
@Entity
class Parent {
...
@OneToMany
Set<Child> children;
...
}
现在,您的Child
实体覆盖equals
和hashcode
,并定义您的Child
实体的唯一性。这会强制Set
NOT 向您的Child
实体添加重复Parent
。
@Entity
class Parent {
...
@OneToMany
Set<Child> children;
...
}