hibernate多对多级联保存、级联删除

多对多映射配置

  1. 创建实体类,人和身份
  2. 让两个实体类 之间互相表示
    • 一个人里面表示所有的身份,使用set集合hibernate多对多级联保存、级联删除_第1张图片
    • 一个身份对应很多人hibernate多对多级联保存、级联删除_第2张图片
  3. 配置映射文件
    • 基本配置
    • 配置多对多关系
      • 人实体类映射配置文件hibernate多对多级联保存、级联删除_第3张图片
      • 身份实体类映射配置文件hibernate多对多级联保存、级联删除_第4张图片
  4. 配置核心配置文件,将映射配置文件引入 到核心配置文件中
    hibernate多对多级联保存、级联删除_第5张图片
  5. 运行工具类测试,成功创建了三张表格
    这里写图片描述

多对多级联保存

  • 第一步:在一端配置文件,这里使用人实体类映射配置文件中的set标签进行配置,cascade 属性值改为save-update这里写图片描述
  • 第二步:写代码实现

    • 创建人和身份对象,将身份保存到人里,最终保存人就可以了,只需要操作一端

      @Test
          public void add() {
              SessionFactory factory = null;
              Session session = null;
              Transaction transaction = null;
              try {
                  factory = HibernateUtils.getSessionFatory();
                  session = factory.openSession();
      //          开启事务
                  transaction = session.beginTransaction();
                  Position p1 = new Position();
                  p1.setPname("董事长");
                  Position p2 = new Position();
                  p2.setPname("总经理");
                  Position p3 = new Position();
                  p2.setPname("保安");
      
                  Person pe1 = new Person();
                  pe1.setName("小名");
                  pe1.setGender("男");
                  pe1.setPhone("3356");
                  pe1.setAge(36);
                  Person pe2 = new Person();
                  pe2.setName("令狐冲");
                  pe2.setGender("男");
                  pe2.setPhone("666");
                  pe2.setAge(18);
      //          建立关系
                  pe1.getSet().add(p1);
                  pe1.getSet().add(p3);
                  pe2.getSet().add(p2);
                  pe2.getSet().add(p1);
      //          保存数据
                  session.save(pe1);
                  session.save(pe2);
      //          提交事务
                  transaction.commit();
      
      
              } catch (Exception e) {
      //          如果发生异常,回滚
                  transaction.rollback();
              }finally {
      //          关闭资源
                  if(session != null) {
                      session.close();
                  }
                  if(factory != null) {
                      factory.close();
                  }
              }
          }
    • 数据库结果:

      • person人表:这里写图片描述
      • position身份表:这里写图片描述
      • p_p第三张表: hibernate多对多级联保存、级联删除_第6张图片

多对多级联删除

  • 第一步:在一端配置文件,这里使用人实体类映射配置文件中的set标签进行配置,cascade 属性值改为delete这里写图片描述
  • 代码中,查询出配置的一端要删除的,然后进行删除方法

    @Test
        public void delete() {
            SessionFactory factory = null;
            Session session = null;
            Transaction transaction = null;
            try {
                factory = HibernateUtils.getSessionFatory();
                session = factory.openSession();
    //          开启事务
                transaction = session.beginTransaction();
    //          查询出要删除的person表格的内容
                Person person = session.get(Person.class, 3);
    //          执行Session的删除方法
                session.delete(person);
    //          提交事务
                transaction.commit();
    
    
            } catch (Exception e) {
    //          如果发生异常,回滚
                transaction.rollback();
            }finally {
    //          关闭资源
                if(session != null) {
                    session.close();
                }
                if(factory != null) {
                    factory.close();
                }
            }
        }
  • 数据库结果:
    • person 表格:这里写图片描述
    • postion身份表格:这里写图片描述
    • p_p表格:这里写图片描述
  • ==注意:==
    • 多对多的关系是靠第三表来维护的,所以不建议执行级联删除操作,可以直接修改第三表实现

多对多中维护第三张表

  • ==多对多的关系靠第三张表来维护==
  • 给某个人添加身份

    1. 查询处要添加的身份,和被添加的人
    2. 将查询出的身份添加到人的set集合中

      @Test
          public void update() {
              SessionFactory factory = null;
              Session session = null;
              Transaction transaction = null;
              try {
                  factory = HibernateUtils.getSessionFatory();
                  session = factory.openSession();
      //          开启事务
                  transaction = session.beginTransaction();
      //          查询出要添加的人
                  Person person = session.get(Person.class, 2);
      //          查询出给人添加的身份
                  Position position = session.get(Position.class, 1);
      //          添加方法
                  person.getSet().add(position);
      //          持久态自动跟新数据库,不需要手动调用方法
      //          提交事务
                  transaction.commit();
      
      
              } catch (Exception e) {
      //          如果发生异常,回滚
                  transaction.rollback();
              }finally {
      //          关闭资源
                  if(session != null) {
                      session.close();
                  }
                  if(factory != null) {
                      factory.close();
                  }
              }
          }
      • 数据库结果:成功给2号人,添加了1号身份hibernate多对多级联保存、级联删除_第7张图片
  • 给某个人移除某个身份

    @Test
        public void remove() {
            SessionFactory factory = null;
            Session session = null;
            Transaction transaction = null;
            try {
                factory = HibernateUtils.getSessionFatory();
                session = factory.openSession();
    //          开启事务
                transaction = session.beginTransaction();
    //          查询出要添加的人
                Person person = session.get(Person.class, 2);
    //          查询出给人添加的身份
                Position position = session.get(Position.class, 1);
    //          移除查询的身份
                person.getSet().remove(position);
    //          持久态自动跟新数据库,不需要手动调用方法
    //          提交事务
                transaction.commit();
    
    
            } catch (Exception e) {
    //          如果发生异常,回滚
                transaction.rollback();
            }finally {
    //          关闭资源
                if(session != null) {
                    session.close();
                }
                if(factory != null) {
                    factory.close();
                }
            }
        }
    • 数据库结果:成功移除2号人中 的1号身份hibernate多对多级联保存、级联删除_第8张图片

你可能感兴趣的:(hibernate)