我在删除一对多关系实体的子元素时遇到问题。
这是一个代码片段:
@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));
}
任务类是这样的:
@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
}
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() {}
}
Task
实体是 child ,即使 save() 函数返回截断的 TaskList
,我无法将更改显示在对数据库的单独查询中。任务数量保持不变。但是,通过 repo.delete(listId)
删除列表列表及其任务都消失了,效果很好。在这里,
repo
是对应于父 TaskList
的存储库类(class)。对 child 的所有操作Task
类(class)通过 @OneToMany({cascade=CascadeType.ALL})
发生关系。出于某种原因,搜索所有
TaskList
s 使用 repo.findAll()
也会返回错误的结果。我显然在做一些根本错误的事情。请告诉我该怎么办。
最佳答案
您需要添加 orphanRemoval = true
到您的映射:@OneToMany(mappedBy="parentList", cascade={CascadeType.ALL}, orphanRemoval=true)
list.getTasks().remove(t)
只是从集合中删除实体,所以你需要告诉 JPA 也从数据库中删除它。这是由 orphanRemoval
完成的属性。
关于Spring JPA - 删除子元素不会反射(reflect)在数据库表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35264809/