JPA Mysql/MariaDB DDL定制外键解决单向关联时无法级联删除的问题
程序员文章站
2022-01-30 20:46:28
...
运行环境
- Java 10
- JPA 2.1
- Mariadb 10.1.33
问题描述
Parent和Child是1对多关系。在JPA中设置了单向关联,即Child中parent
指向Parent,但是Parent中没有定义相应的children
集合。在这种情况下,删除Parent如果存在关联的Child的话,将触发外键约束导致无法删除。(如果是双向关联的话,JPA设置CascadeType.ALL
会自动级联删除,究其原因应该是单向关联时JPA无法从Parent对象取得关联的Child对象)。
解决方案
在这种情况下,需要在数据库的外键设置上加上ON DELETE CASCADE
和/或ON UPDATE CASCADE
。具体实现可以看示例代码。
示例代码
class Parent {
@Id
@GeneratedValue
Long _id
/*
这里没有定义子类集合,即可以从Child获得Parent,但不能从Parent获得所属的Child
@OneToMany(mappedBy = "parent", cascade = CascadeType.ALL)
List<Child> children
*/
}
class Child {
..... // 忽略无关部分
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(
name = "parent_id", referencedColumnName = "_id",
foreignKey = @ForeignKey(
name = "FK_child_to_parent",
foreignKeyDefinition = "foreign key (parent_id) REFERENCES parent (_id) ON DELETE CASCADE ON UPDATE CASCADE"))
Parent parent;
}
下一篇: Thinkphp5的砍价活动相关设计