Hibernate:删除父实体会触发对子项的更新查询

问题描述 投票:0回答:1

情况

我有一对父子对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(spring boot repository)删除父实体时

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,除了移除等。
  • 启用/禁用双方的延迟加载。
mysql spring hibernate cascade
1个回答
1
投票

您错过了双向注释一侧的“mappedBy”参数,有效地创建了两个单向关系。使用mappedBy参数替换一侧的JoinColumn,您应该获得正确的删除语句。

© www.soinside.com 2019 - 2024. All rights reserved.