Hibernate:删除父实体会触发对子实体的更新查询
Hibernate: Deleting parent entity triggers update query on children
情况
我有一对 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服务器中,有级联设置。子table的创建命令状态:
FOREIGN KEY (job_template_id) REFERENCES job_template(id) ON DELETE CASCADE
如果我通过手动输入 sql 命令删除实体,则级联工作正常。
问题
当我尝试通过调用
通过 JPA(spring 引导存储库)删除父实体时
jobTemplateRepo.delete(jobTemplateToDelete); //from CrudRepository
JPA 触发对子 table:
的更新查询
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
目标
我想在 create/update 操作中使用从父级到子级的 JPA 级联。但是当删除一个父实体时,我希望 JPA 只触发对该实体的删除查询而不尝试更新子实体,因为这会导致问题并且 mySQL 无论如何都会处理这个问题。
我试过的
- 多种级联组合,包括ALL、all except remove等
- Enabling/disabling两边延迟加载
您错过了双向注释一侧的“mappedBy”参数,有效地创建了两个单向关系。
用 mappedBy 参数替换一侧的 JoinColumn,您应该得到正确的删除语句。
情况
我有一对 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服务器中,有级联设置。子table的创建命令状态:
FOREIGN KEY (job_template_id) REFERENCES job_template(id) ON DELETE CASCADE
如果我通过手动输入 sql 命令删除实体,则级联工作正常。
问题
当我尝试通过调用
通过 JPA(spring 引导存储库)删除父实体时jobTemplateRepo.delete(jobTemplateToDelete); //from CrudRepository
JPA 触发对子 table:
的更新查询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
目标
我想在 create/update 操作中使用从父级到子级的 JPA 级联。但是当删除一个父实体时,我希望 JPA 只触发对该实体的删除查询而不尝试更新子实体,因为这会导致问题并且 mySQL 无论如何都会处理这个问题。
我试过的
- 多种级联组合,包括ALL、all except remove等
- Enabling/disabling两边延迟加载
您错过了双向注释一侧的“mappedBy”参数,有效地创建了两个单向关系。 用 mappedBy 参数替换一侧的 JoinColumn,您应该得到正确的删除语句。