作者:何征天
课程视频地址:https://ke.qq.com/course/273907
1.1. 技术分析之级联保存
测试:如果现在代码只插入其中的一方的数据
1. * 如果只保存其中的一方的数据,那么程序会抛出异常。
* 如果想完成只保存一方的数据,并且把相关联的数据都保存到数据库中,那么需要配置级联!!
* 级联保存是方向性
2. 级联保存效果
* 级联保存:保存一方同时可以把关联的对象也保存到数据库中!!
* 使用cascade="save-update"
1.2.1. 级联保存示例
1.保存客户数据,在TestOne2Many中添加方法测试
//代码只插入其中一方的数据 @Test publicvoid run2(){ Session session = HibernateUtils.getCurrentSession(); Transaction tr = session.beginTransaction();
//新建一个客户 Customer c = new Customer(); c.setCust_name("小凤");
//新建2个联系人 Linkman m1 = new Linkman(); m1.setLkm_name("小凤的男朋友1");
Linkman m2 = new Linkman(); m2.setLkm_name("小凤的男朋友2");
//客户中添加联系人 c.getLinkmans().add(m1); c.getLinkmans().add(m2);
//开始保存 session.save(c);
tr.commit(); } |
会报错:
原因结论:在hibernate代码中,在session.flush前,不允许持久态对象关联瞬时态对象
持久态对象只能关联持久态对象!
解决:采用级联,cascade :cascade="save-update"
它的作用:
可以使持久态对象”关联”瞬时态对象,自动会隐式执行save操作,变为持久态,
可以使持久态对象”关联”脱管对象,自动会隐式执行update操作,变为持久态
如果通过操作customer来级联保存linkman,需要在Customer.hbm.xml(谁是持久的) 配置级联.
2.修改Customer.hbm.xml:
<!-- 配置级联保存:cascade:save-update --> <set name="linkmans" cascade="save-update"> |
3.测试
使用级联之后,Hibernate会对瞬时态的这个对象,会自动执行save操作.
问题:如果保存顺序反过来呢?即先保存联系人,同时保存客户呢?
分析:先操作linkman,级联保存 customer ,需要在Linkman.hbm.xml 配置级联
<many-to-one cascade="save-update" name="Customer" class="com.igeek.demo1.Customer" column="lkm_cust_id"></many-to-one> |
在TestOne2Many中添加方法测试
//级联保存 @Test publicvoid run3(){ Session session = HibernateUtils.getCurrentSession(); Transaction tr = session.beginTransaction();
//新建一个客户 Customer c = new Customer(); c.setCust_name("小凤");
//新建2个联系人 Linkman m1 = new Linkman(); m1.setLkm_name("小凤的男朋友1");
Linkman m2 = new Linkman(); m2.setLkm_name("小凤的男朋友2");
//联系人中添加客户 m1.setCustomer(c); m2.setCustomer(c);
//开始保存 session.save(m1); session.save(m2);
tr.commit(); } |