Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 通过父实体更新删除添加子实体列表_Java_Spring Data Jpa_Hibernate Mapping - Fatal编程技术网

Java 通过父实体更新删除添加子实体列表

Java 通过父实体更新删除添加子实体列表,java,spring-data-jpa,hibernate-mapping,Java,Spring Data Jpa,Hibernate Mapping,是否有更好的方法根据新传递的子实体列表添加、更新、删除子实体(列表) 我的更新功能 Parent parent = findById(id); //make changes to parent attributes //parent.setXyz(dto.getXyz()); //convert newly passed sons to hashmap Map<String, Son> newSons = toHashMap(dto.getSons()); List<So

是否有更好的方法根据新传递的子实体列表添加、更新、删除子实体(列表

我的更新功能

Parent parent = findById(id);

//make changes to parent attributes
//parent.setXyz(dto.getXyz());

//convert newly passed sons to hashmap
Map<String, Son> newSons = toHashMap(dto.getSons());

List<Son> finalSons = new ArrayList<>();

for (Son oldSon : parent.getSons()) {
    if (newSons.containsKey(oldSon.getUniqueString())) {
        finalSons.add(oldSon);
        newSons.remove(oldSon.getUniqueString());
    } else {
        //Delete the son thats not in new list
        sonRepository.delete(oldSon);
    }
}

//add remaining sons
for (Son son : newSons) {
    finalSons.add(son);
}

//existing.getSons().clear();
//existing.getSons().addAll(finalSons);
existing.getSons().clear();

parentRepository.save(parent);

当你使用JPA的
孤儿删除
功能时,你可以让你的更新过程更轻松一些,但是要小心,因为这会导致你不自觉地删除东西:

Parent.java
@Entity(name=“parents”)
公共类父类{
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
私有整数id;
私有字符串标题;
@OneToMany(mappedBy=“parent”,cascade=CascadeType.ALL,fetch=FetchType.EAGER,orphan=true)
私人名单;
}
服务
Parent=findById(id);
Map addedSons=toHashMap(dto.getSons());
//删除不属于更新的现有子系统
parent.getSons().removeIf(existingSon->!addedSons.containsKey(existingSon.getUniqueString());
//增加新儿子
addedSons.forEach(parent.getSons()::add);
//保存父项并触发添加子项的创建/删除已删除的现有子项
parentRepository.save(父级);

这在很大程度上取决于
父对象中的映射
-当您使用
级联类型
孤立删除
时,您根本不需要添加/保存/删除任何子对象,您只需确保对象设置正确,然后保存父对象,然后休眠即可完成其余操作(如果更改,请保存现有的子项,添加新的子项,删除新的孤立子项)。也就是说,请添加
父项
子项
的代码,否则这只是猜测。@Smutje用实体更新了问题
@Entity(name = "parents")
public class Parent {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    private String title;
    
    @OneToMany(mappedBy = "parent", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    private List<Son> sons;
}
@Entity(name = "sons")
public class Son {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    
    @ManyToOne
    @JoinColumn(name = "parentId")
    private Parent parent;
}
@Entity(name = "parents")
public class Parent {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    private String title;
    
    @OneToMany(mappedBy = "parent", cascade = CascadeType.ALL, fetch = FetchType.EAGER, orphanRemoval = true)
    private List<Son> sons;
}
Parent parent = findById(id);

Map<String, Son> addedSons = toHashMap(dto.getSons());

// Remove existing sons that are not part of the update
parent.getSons().removeIf(existingSon -> !addedSons.containsKey(existingSon.getUniqueString()));

// Add new sons
addedSons.forEach(parent.getSons()::add);

// Save parent and trigger creating of added sons/deletion of removed existing sons
parentRepository.save(parent);