spring data jpa上的级联删除问题
程序员文章站
2022-05-01 23:27:14
...
spring data jpa上的级联删除
先来看一段报错:
Caused by: java.sql.SQLIntegrityConstraintViolationException: Cannot delete or update a parent row: a foreign key constraint fails (
blog
.t_blog
, CONSTRAINTFK292449gwg5yf7ocdlmswv9w4j
FOREIGN KEY (type_id
) REFERENCESt_type
(id
))
大致说的是在我要删除某一条数据的时候被拒绝了,原因是存在其他表已将该表的主键设为了它的外建,所以没办法单独的删除该表数据。
而最初t_blog表和t_type表的关系是这样的:
@Entity
@Table(name = "t_blog")
public class Blog {
@ManyToOne //多的一方是维护端。
private Type type;
}
@Entity
@Table(name = "t_type")
public class Type {
@OneToMany(mappedBy = "type")
private List<Blog> blogs = new ArrayList<>();
}
可以看出表中并没有指出两张表直接的级联等级。所以要解决这个问题就应该手动在被维护端上执行级联等级,下面是修改后的Class Type
@Entity
@Table(name = "t_type")
public class Type {
//cascade在这里是一个数组,可同时指定多种级联等级
@OneToMany(mappedBy = "type",cascade = {CascadeType.REMOVE})
private List<Blog> blogs = new ArrayList<>();
}
再添加完级联删除后是什么样的结果呢?
- 当你删除维护端的一条数据时,会同时将那些将该数据主键作为自己外建的数据都删除。
当两表关系为多对多时,在维护端删除一条数据后,只会同时删除包含改数据主键的
中间表
的数据,而不会影响另一张表。