1. 程式人生 > >hibernate多對多級聯儲存、級聯刪除

hibernate多對多級聯儲存、級聯刪除

多對多對映配置

  1. 建立實體類,人和身份
  2. 讓兩個實體類 之間互相表示
    • 一個人裡面表示所有的身份,使用set集合這裡寫圖片描述
    • 一個身份對應很多人這裡寫圖片描述
  3. 配置對映檔案
    • 基本配置
    • 配置多對多關係
      • 人實體類對映配置檔案這裡寫圖片描述
      • 身份實體類對映配置檔案這裡寫圖片描述
  4. 配置核心配置檔案,將對映配置檔案引入 到核心配置檔案中
    這裡寫圖片描述
  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第三張表:

多對多級聯刪除

  • 第一步:在一端配置檔案,這裡使用人實體類對映配置檔案中的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號身份這裡寫圖片描述
  • 給某個人移除某個身份

    @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號身份這裡寫圖片描述