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()也将返回错误的结果。
我显然在做一些根本错误的事情。请告诉我应该怎么做。
您需要添加orphanRemoval = true到映射中:
@OneToMany(mappedBy="parentList", cascade={CascadeType.ALL}, orphanRemoval=true)
list.getTasks().remove(t)只是从集合中删除实体,因此您需要告诉JPA也将其从数据库中删除。这是通过orphanRemoval属性完成的。
| 归档时间: |
|
| 查看次数: |
1669 次 |
| 最近记录: |