我对Cascade.ALL的影响感到有些困惑。
我有两个班级:
class Task {
@OneToOne(mappedBy = "task", cascade = CascadeType.ALL, orphanRemoval = true)
private Status status;
}
class Status {
@OneToOne
@JoinColumn(name = "task_id", updatable = false)
private Task task;
@Column(name="name")
private String name;
}
我认为保存状态不会影响类任务,因为级联应用于类Task而不是Status,但它确实修改了我的数据库中的任务对象。 所以我想知道是否
Task task = status.getTask();
task.setName(xxx);
taskDao.save(task);
与
具有相同的效果taskDao.save(status.getTask.setName(xxx));
是不同的
statusDao.save(task.getStatus)
和statusDao.save(status)
?
感谢。
答案 0 :(得分:0)
我认为您的注释会混淆关系的所有者。一方面,您要指定@JoinColumn(name = "task_id")
,使Status实体成为关系的所有者,另一方面,您要在Task实体上指定@OneToOne(mappedBy = "task"...
,使其成为关系的所有者。 / p>
因此状态拥有该关系,当您保存状态时,它转到任务,发现它也拥有该关系并且具有CascadeType.ALL,因此它将级联应用于保存(PERSIST)。
您可能应该确定哪个实体应该拥有该关系,然后删除mappedBy
或@JoinColumn