spring data jpa的级联 理解 记录
删除操作的说明如下:
1.没有从表数据引用:主表随便删
2.删除从表数据:可以随时任意删除。
主表的主键被从表引用,删除主表数据:
1.删除主表的数据是报错的,主表的主键被其他表引用了
2、如果还想删除,使用级联删
在实际开发中,级联删除请慎用!(在一对多的情况下)
级联操作:指操作一个对象同时操作它的关联对象
举例:删除主体对象的同时删除它的所有关联对象
使用方法:只需要在操作主体的注解上配置cascade
/**
* cascade:配置级联操作
* CascadeType.DETACH 级联脱管
* CascadeType.MERGE 级联更新
* CascadeType.PERSIST 级联保存:
* CascadeType.REFRESH 级联刷新:
* CascadeType.REMOVE 级联删除:
* CascadeType.ALL 包含所有
*/
使用:
@OneToMany(mappedBy=“customer”,cascade=CascadeType.ALL)
解释:
CascadeType.DETACH
Cascade detach operation,级联脱管/游离操作。
如果你要删除一个实体,但是它有外键无法删除,你就需要这个级联权限了。它会撤销所有相关的外键关联。
CascadeType.REFRESH
Cascade refresh operation,级联刷新操作。
假设场景 有一个订单,订单里面关联了许多商品,这个订单可以被很多人操作,那么这个时候A对此订单和关联的商品进行了修改,与此同时,B也进行了相同的操作,但是B先一步比A保存了数据,那么当A保存数据的时候,就需要先刷新订单信息及关联的商品信息后,再将订单及商品保存。(来自良心会痛的评论)
CascadeType.ALL
Cascade all operations,清晰明确,拥有以上所有级联操作权限。
链接:https://www.jianshu.com/p/e8caafce5445
级联删除很简单,下面是级联新增的测试:
@Test
@Transactional //开启事务
@Rollback(false)//设置为不回滚
public void testscade() {
/**
* 一对多的关系配置级联
* 最终得出设置级联要设置到主表上去
* 正常情况下删除主表的数据是报错的,主表的主键被其他表引用了,如果要删除要在主表实体上配置级联
* 客户实体上配置了级联属性
* 操作客户实体就会影响到它关联的联系人实体上
* 做到删除客户的同时也删除了下面的所有联系人
* 那么反过来配置级联就错了
* 如果多个联系人对应一个客户,删除一个联系人的时候也要删除客户就报错
* 如果一个联系人对应一个客户,删除联系人的时候是可以删除客户数据的不报错
*
*/
Customer c = new Customer();
c.setCustName("TBD云集中心");
c.setCustLevel("VIP客户");
c.setCustSource("网络");
c.setCustIndustry("商业办公");
c.setCustAddress("昌平区北七家镇");
c.setCustPhone("010-84389340");
LinkMan l = new LinkMan();
l.setLkmName("TBD联系人");
l.setLkmGender("male");
l.setLkmMobile("13811111111");
l.setLkmPhone("010-34785348");
l.setLkmEmail("[email protected]");
l.setLkmPosition("老师");
l.setLkmMemo("还行吧");
LinkMan l2 = new LinkMan();
l2.setLkmName("TBD联系人");
l2.setLkmGender("male");
l2.setLkmMobile("13811111111");
l2.setLkmPhone("010-34785348");
l2.setLkmEmail("[email protected]");
l2.setLkmPosition("老师");
l2.setLkmMemo("还行吧");
// c.getLinkmans().add(l);//配置了客户到联系人1的关系
// c.getLinkmans().add(l2);//配置了客户到联系人2的关系
// l.setCustomer(c);//也配置了联系人1到客户的关系
// l2.setCustomer(c);//也配置了联系人2到客户的关系
// customerDao.save(c);
/**
* 一对多的关系:
* 客户为一的一方,联系人为多的一方
* 保存客户的同时,保存多个联系人
* 配置:
* 客户一的一方放弃维护外键的权利,(所以一的一方保存的时候不会维护外键)并且一的一方配置了级联属性
* 新增客户的同时也新增联系人,但是没有设置客户实体维护外键关系,所以联系人的外键为空
* 这时候就要显示的表示联系人到客户的关系
*/
c.getLinkmans().add(l);
c.getLinkmans().add(l2);
l.setCustomer(c);
l2.setCustomer(c);
customerDao.save(c);
}
推荐阅读
-
详解Spring Data JPA动态条件查询的写法
-
Spring boot中使用Spring-data-jpa方便快捷的访问数据库(推荐)
-
详解Spring Data Jpa 模糊查询的正确用法
-
Spring Data Jpa 复合主键的实现
-
Spring Data JPA 建立表的联合主键
-
使用Spring Data JPA的坑点记录总结
-
Spring Data Jpa 自动生成表结构的方法示例
-
Spring boot中使用Spring-data-jpa方便快捷的访问数据库(推荐)
-
详解Spring Data JPA动态条件查询的写法
-
详解Spring Data JPA系列之投影(Projection)的用法