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("98354834@qq.com");
			l.setLkmPosition("老师");
			l.setLkmMemo("还行吧");
			LinkMan l2 = new LinkMan();
			l2.setLkmName("TBD联系人");
			l2.setLkmGender("male");
			l2.setLkmMobile("13811111111");
			l2.setLkmPhone("010-34785348");
			l2.setLkmEmail("98354834@qq.com");
			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);
			                             			
		}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值