Spring数据JPA OneToOne级联

时间:2018-05-29 16:33:34

标签: spring-data-jpa

我对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)

感谢。

1 个答案:

答案 0 :(得分:0)

我认为您的注释会混淆关系的所有者。一方面,您要指定@JoinColumn(name = "task_id"),使Status实体成为关系的所有者,另一方面,您要在Task实体上指定@OneToOne(mappedBy = "task"...,使其成为关系的所有者。 / p>

因此状态拥有该关系,当您保存状态时,它转到任务,发现它也拥有该关系并且具有CascadeType.ALL,因此它将级联应用于保存(PERSIST)。

您可能应该确定哪个实体应该拥有该关系,然后删除mappedBy@JoinColumn