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

spring data jpa的级联 理解 记录

程序员文章站 2022-05-01 23:13:38
...

删除操作的说明如下:
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);
			                             			
		}