Spring JPA-删除子元素不会反映在数据库表中

cst*_*992 5 spring hibernate jpa

我在删除一对多关系实体的子元素时遇到问题。这是一个代码片段:

@Override
@Transactional
public void deleteTask(UUID listId, UUID taskId) {
    TaskList list = repo.findOne(listId);

    System.out.println("Old List: " + list);

    for(Task t : list.getTasks()) {
        if(t.getId().toString().equals(taskId.toString())) {
            System.out.println(list.getTasks().remove(t));
            System.out.println("Task with id " + taskId + " deleted.");
        }
    }
    System.out.println("New List: " + repo.save(list));
}
Run Code Online (Sandbox Code Playgroud)

Task类是这样的:

@Entity(name = "task")
public class Task implements Serializable {    

    // Id and 3 fields

    @ManyToOne
    @JoinColumn(name="tasklist_id")
    private TaskList parentList;

    // 3 more fields

    // Constructor
    public Task() {}

    //Getters and Setters
}
Run Code Online (Sandbox Code Playgroud)

TaskList类是这样的:

@Entity(name = "task_list")
public class TaskList implements Serializable {

    // Id and two fields

    @OneToMany(mappedBy="parentList", cascade={CascadeType.ALL})
    private List<Task> tasks;

    // Constructor
    public TaskList() {}
}
Run Code Online (Sandbox Code Playgroud)

Task实体是孩子,即使保存()函数返回截断TaskList,我不能改变在一个单独的数据库查询显示。任务数保持不变。但是,通过删除列表repo.delete(listId)可以很好地处理列表及其任务。

这里repo是对应于父TaskList类的存储库。子Task类的所有操作都通过@OneToMany({cascade=CascadeType.ALL})关系进行。

出于某种原因,搜索所有TaskList使用S repo.findAll()也将返回错误的结果。

我显然在做一些根本错误的事情。请告诉我应该怎么做。

Jak*_*ski 5

您需要添加orphanRemoval = true到映射中:

@OneToMany(mappedBy="parentList", cascade={CascadeType.ALL}, orphanRemoval=true)

list.getTasks().remove(t)只是从集合中删除实体,因此您需要告诉JPA也将其从数据库中删除。这是通过orphanRemoval属性完成的。