hibernate一对多级联操作

一对多级联操作

级联保存
- 添加一个订单,为这个订单添加多个商品
- 这样两个表都需要进行操作,称为级联保存
- 级联删除
- 删除某一个订单,这个订单里面的所有的商品都要删除
- 两张表的内容都要删除,称为级联删除

一对多级联保存演示

  • 复杂写法:

    • 代码:

      package com.td.dao;
      
      import org.hibernate.Session;
      import org.hibernate.SessionFactory;
      import org.hibernate.Transaction;
      import org.junit.Test;
      
      import com.td.domain.Goods;
      import com.td.domain.Order;
      import com.td.utils.HibernateUtils;
      
      public class Demo1 {
          @Test
          /*
           * 演示一对多级联保存
           * */
          public void test1() {
              SessionFactory factory = null;
              Session session = null;
              Transaction transaction = null;
              try {
      //          获取SessionFactory对象
                  factory = HibernateUtils.getSessionFatory();
      //          获取Session对象
                  session = factory.openSession();
      //          开启 事务
                  transaction = session.beginTransaction();
      //          一对多级联保存
      //          创建实体类 对象,设置属性值,但是和 表格中对应的唯一属性不需要设置
                  Order order = new Order();
                  order.setOaddress("山西");
                  order.setPhone("223");
      
                  Goods goods = new Goods();
                  goods.setGname("哇哈哈");
                  goods.setGaddress("河南");
                  goods.setPrice(2);
      
      //          给实体类对象建立联系
      //          将商品放到订单的set集合 中
                  order.getSetGoods().add(goods);
      //          将订单放到商品属于的订单里
                  goods.setOrder(order);
      
      //          执行seesion的保存操作
                  session.save(goods);
                  session.save(order);
      //          提交事务
                  transaction.commit();
      
              } catch (Exception e) {
                  e.printStackTrace();
      //          如果出现异常,执行回滚操作
                  transaction.rollback();
              }finally {
      //          关闭资源
                  if(session != null) {
                      session.close();
                  }
                  if(factory != null) {
                      factory.close();
                  }
              }
          }
      }   
      
    • 表格结果:

      • 订单表
      • 商品表:
      • 商品表中的oid是外键,对应订单表中的oid,为了便于观察可以键外键表的名字在映射配置文中修改为一样的
  • 简化写法:

    • 一般根据订单添加商品
    • 在客户配置文件中set标签内进行配置hibernate一对多级联操作_第1张图片
      • 添加属性cascade:save-update
    • 代码:

      @Test
          /*
           * 演示一对多级联保存,简化写法,只需要写一端
           * */
          public void test2() {
              SessionFactory factory = null;
              Session session = null;
              Transaction transaction = null;
              try {
      //          获取SessionFactory对象
                  factory = HibernateUtils.getSessionFatory();
      //          获取Session对象
                  session = factory.openSession();
      //          开启 事务
                  transaction = session.beginTransaction();
      //          一对多级联保存
      //          创建实体类 对象,设置属性值,但是和 表格中对应的唯一属性不需要设置
                  Order order = new Order();
                  order.setOaddress("北京");
                  order.setPhone("556");
      
                  Goods goods = new Goods();
                  goods.setGname("六个核桃");
                  goods.setGaddress("山东");
                  goods.setPrice(5);
      
      //          给实体类对象建立联系
      //          将商品放到订单的set集合 中,只需要维护一端,将商品放到订单里,不需要将订单放到商品里
                  order.getSetGoods().add(goods);
      
      //          执行seesion的保存操作,简化操作,只需亚欧保存order就可以
      
                  session.save(order);
      //          提交事务
                  transaction.commit();
      
              } catch (Exception e) {
                  e.printStackTrace();
      //          如果出现异常,执行回滚操作
                  transaction.rollback();
              }finally {
      //          关闭资源
                  if(session != null) {
                      session.close();
                  }
                  if(factory != null) {
                      factory.close();
                  }
              }
          }
    • 数据库表结果:

      • 订单表:hibernate一对多级联操作_第2张图片
      • 商品表:hibernate一对多级联操作_第3张图片

一对多级联删除

  • 删除某个订单,将订单里的联系人都删除
  • 步骤:

    • 第一步:在客户的映射文件set标签内,进行配置,==cascade的 属性值为delete==,如果有多个值使用逗号分开image
    • 根据id查询到要删除的对象,调用Session的里面的delete方法删除image
      @Test
          /*
           * 演示一对多级联删除,简化写法,只需要写一端
           * */
          public void test3() {
              SessionFactory factory = null;
              Session session = null;
              Transaction transaction = null;
              try {
      //          获取SessionFactory对象
                  factory = HibernateUtils.getSessionFatory();
      //          获取Session对象
                  session = factory.openSession();
      //          开启 事务
                  transaction = session.beginTransaction();
      //          一对多级联删除
      //          查询到要删除的实体类对象,只需要查询主键表
                  Order order = session.get(Order.class, 1);
      //          执行删除操作
                  session.delete(order);
      //          提交事务
                  transaction.commit();
      
              } catch (Exception e) {
                  e.printStackTrace();
      //          如果出现异常,执行回滚操作
                  transaction.rollback();
              }finally {
      //          关闭资源
                  if(session != null) {
                      session.close();
                  }
                  if(factory != null) {
                      factory.close();
                  }
              }
          }

一对多修改操作

  • 代码:
@Test
    /*
     * 演示一对多级修改操作
     * */
    public void test4() {
        SessionFactory factory = null;
        Session session = null;
        Transaction transaction = null;
        try {
//          获取SessionFactory对象
            factory = HibernateUtils.getSessionFatory();
//          获取Session对象
            session = factory.openSession();
//          开启 事务
            transaction = session.beginTransaction();
//          一对多级联修改操作,将订单表的3号数据,匹配到商品的4号
            Order order = session.get(Order.class, 3);
            Goods goods = session.get(Goods.class, 4);
//          将4号商品放到3号订单里
            order.getSetGoods().add(goods);
//          持久态自动跟新数据库,不需要手动跟新
//          提交事务
            transaction.commit();

        } catch (Exception e) {
            e.printStackTrace();
//          如果出现异常,执行回滚操作
            transaction.rollback();
        }finally {
//          关闭资源
            if(session != null) {
                session.close();
            }
            if(factory != null) {
                factory.close();
            }
        }
    }

#

  • 进行配置让某一方不维护外键,提高程序的效率
    • 方法:在一对多一的一方对应的实体类的映射配置文件中的set标签内添加属性inverse值设置为true
    • 默认值是false:不放弃关系维护,改为true:放弃关系维护hibernate一对多级联操作_第4张图片

你可能感兴趣的:(hibernate)