zoukankan      html  css  js  c++  java
  • Hibernate入门(九)级联删除

    Hibernate级联删除

      上一篇文章学习了级联保存和更新,这个级联删除应该很好理解的。一样的道理,删除一方,同时删除有关联的一方。

      https://www.cnblogs.com/deepSleeping/p/9978296.html

      同样有方向性。

      删除客户,客户下的订单也同样删除。

      用户表:

      

      订单表:

    业务:删除id值为1的客户,想要的效果:同时删除id值为1的客户下的所有订单

    1.配置customer.hbm.xml文件(cascade = "delete")

    <!-- 配置一对多属性 -->
            <set name="ods" cascade="delete">
                <key column="cust_order_id" ></key>
                <one-to-many class="Order"/>
            </set>

    2.java测试类

    /**
         * 删除id值为1的用户,级联删除该用户下的订单
         */
        @Test
        public void fun(){
            Session session = HibernateUtils.getSession();
            session.getTransaction().begin();
            
            try {
                //获取id值为1的用户  持久态
                Customer cst = session.get(Customer.class, 1);
                
                session.delete(cst);
            } catch (Exception e) {
                session.getTransaction().rollback();
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            
            
            session.getTransaction().commit();
        }

     

     生成的SQL语句

    Hibernate: 
        select
            customer0_.cust_id as cust_id1_0_0_,
            customer0_.cust_name as cust_nam2_0_0_,
            customer0_.cust_gender as cust_gen3_0_0_,
            customer0_.cust_age as cust_age4_0_0_,
            customer0_.cust_phone as cust_pho5_0_0_ 
        from
            customera customer0_ 
        where
            customer0_.cust_id=?
    Hibernate: 
        select
            ods0_.cust_order_id as cust_ord3_1_0_,
            ods0_.order_id as order_id1_1_0_,
            ods0_.order_id as order_id1_1_1_,
            ods0_.detail_id as detail_i2_1_1_,
            ods0_.cust_order_id as cust_ord3_1_1_ 
        from
            ordersa ods0_ 
        where
            ods0_.cust_order_id=?
    Hibernate: 
        update
            ordersa 
        set
            cust_order_id=null 
        where
            cust_order_id=?
    Hibernate: 
        delete 
        from
            ordersa 
        where
            order_id=?
    Hibernate: 
        delete 
        from
            ordersa 
        where
            order_id=?
    Hibernate: 
        delete 
        from
            customera 
        where
            cust_id=?

    很明显,删除了id为1的客户同时,删除了该客户下的订单

    然后翻转方向,删除订单,同时删除有这个订单的所有客户(虽然应该不会有这种奇怪的需求把....hah )

    一样的配置和java代码编写后同样是测试成功了。

    提示:最好在测试第二个之前,要把customer.hbm.xml配置中的级联删除的属性去掉,不然订单删除,然后删除级联的客户,客户删除后,又级联删除该客户下的订单,如此反复,估计表里的数据也差不多没了吧。。。。

  • 相关阅读:
    我的家庭保险方案推荐
    如何修改Total Commander配件文件的位置
    豆瓣统计-2015
    RESTful API接口设计规范
    正则表达式中 的$1,$2与实际应用
    查询排序:order by case when理解、在order By子句中使用case语句的理解
    架构设计:BFF和Serverless简介
    移动端1px细线解决方案总结
    SpringMVC中实体类属性is开头的字段返回JSON时自动去掉is开头的问题
    详解JS面向对象的三大特征之多态
  • 原文地址:https://www.cnblogs.com/deepSleeping/p/9979112.html
Copyright © 2011-2022 走看看