【极客营】Hibernate完成CRM的联系人的保存操作-技术分析之级联保存

作者:何征天

课程视频地址: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();

    }

级联对于大量的保存或更新操作非常有用



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值