休眠:删除父实体会触发子实体的更新查询

时间:2019-03-28 13:43:45

标签: mysql spring hibernate cascade

情况

我有一对JPA实体的父子对。 父级称为JobTemplate,并将子级称为:

@OneToMany(cascade = {CascadeType.MERGE,CascadeType.PERSIST}, orphanRemoval = true, fetch = FetchType.LAZY)
@JoinColumn(name = "job_template_id")
private List<ChecklistTemplateEntry> checklistEntries = new ArrayList<>();

子级称为ChecklistTemplateEntry,并这样引用其父级:

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "job_template_id")
private JobTemplate jobTemplate;

在mySQL服务器中,有一个级联设置。子表的创建命令指出:

 FOREIGN KEY (job_template_id) REFERENCES job_template(id) ON DELETE CASCADE 

如果我通过手动键入sql命令删除实体,则级联工作正常。

问题

当我尝试通过调用

通过JPA(春季启动存储库)删除父实体时
jobTemplateRepo.delete(jobTemplateToDelete); //from CrudRepository

JPA触发对子表的更新查询:

update checklist_template_entry set job_template_id=null where job_template_id=?

mySQL不接受此查询,因为job_template_id具有NOT NULL规则(有充分的理由)。 结果是我无法删除我的实体。我得到:

java.sql.SQLException: Column 'job_template_id' cannot be null

目标

我想在创建/更新操作中使用从父级到子级的JPA级联。但是,当删除父实体时,我希望JPA仅在该实体上触发删除查询,而不要尝试更新子实体,因为这会引起问题,而mySQL仍会处理该问题。

我尝试过的事情

  • 各种级联组合,包括ALL,除remove等以外的所有组合。
  • 启用/禁用双方的延迟加载。

1 个答案:

答案 0 :(得分:1)

您会错过双向注释一侧的“ mappedBy”参数,从而有效地创建了两个单向关系。 将一侧的JoinColumn替换为mappingBy参数,您将获得正确的delete语句。