Mysql Hibernate:删除父实体会触发对子实体的更新查询
形势 我有一对JPA实体的父子关系。 父对象称为JobTemplate,并将子对象称为:Mysql Hibernate:删除父实体会触发对子实体的更新查询,mysql,spring,hibernate,cascade,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
@OneToMany(cascade = {CascadeType.MERGE,CascadeType.PERSIST}, orphanRemoval = true, fetch = FetchType.LAZY)
@JoinColumn(name = "job_template_id")
private List<ChecklistTemplateEntry> checklistEntries = new ArrayList<>();
在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有一个NOTNULL规则(有充分的理由)。
结果是我无法删除我的实体。我得到:
java.sql.SQLException: Column 'job_template_id' cannot be null
目标
我想在创建/更新操作中使用从父级到子级的JPA级联。但是,当删除父实体时,我希望JPA只在该实体上触发一个删除查询,而不尝试更新子实体,因为这会导致问题,mySQL将处理这些问题
我尝试过的
- 级联的各种组合,包括全部、除移除以外的全部等
- 启用/禁用两侧的延迟加载
用mappedBy参数替换一侧的JoinColumn,您应该得到正确的delete语句。我认为您错过了“mappedBy”"一方的论据,bidirection@MartinFrey您刚刚救了我一天!在父实体类的OneToMany注释中用mappedBy参数替换JoinColumn注释解决了我的问题。您是否尝试过将OrphanRemoving=true改为OrphanRemoving=false?数据库正在处理该问题。@MartinFrey您能发布此消息吗作为回答,以便我能将其标记为已接受回答?Thanks@PeterHe如果我没有弄错的话,删除孤立项对于更新操作很有用,以防您从集合中删除实体。我需要这个功能。。。
java.sql.SQLException: Column 'job_template_id' cannot be null