欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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;

}
相关标签: JPA