在jpa中将dto转换为实体保存策略

时间:2017-10-19 12:55:44

标签: hibernate jpa spring-data-jpa

在带有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
    }

}

2 个答案:

答案 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实体覆盖equalshashcode,并定义您的Child实体的唯一性。这会强制Set NOT 向您的Child实体添加重复Parent

@Entity
class Parent {

    ...

    @OneToMany
    Set<Child> children;

    ...

}