情况
我有一对父子对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无论如何都会处理这个问题。
我试过了什么
您错过了双向注释一侧的“mappedBy”参数,有效地创建了两个单向关系。使用mappedBy参数替换一侧的JoinColumn,您应该获得正确的删除语句。