1. 程式人生 > >【JAVAEE學習筆記】hibernate03:多表操作,級聯練習:添加聯系人

【JAVAEE學習筆記】hibernate03:多表操作,級聯練習:添加聯系人

row tac 默認值 rac user except pro intra com

一、一對多|多對一

1、關系表達

 表中的表達

  技術分享

  實體中的表達

  技術分享

  orm元數據中表達

    一對多

        <!-- 集合,一對多關系,在配置文件中配置 -->
        <!-- 
            name屬性:集合屬性名
            column屬性: 外鍵列名
            class屬性: 與我關聯的對象完整類名
         -->
        <set name="linkMens" inverse="true" cascade="delete"  >
            <
key column="lkm_cust_id" ></key> <one-to-many class="LinkMan" /> </set>

    多對一

        <!-- 多對一 -->
        <!-- 
            name屬性:引用屬性名
            column屬性: 外鍵列名
            class屬性: 與我關聯的對象完整類名
         -->
        <many-to-one name="customer"
column="lkm_cust_id" class="Customer" > </many-to-one>

2、操作

  操作關聯屬性

        //3操作
        Customer c = new Customer();
        c.setCust_name("傳智播客");
        
        LinkMan lm1 = new LinkMan();
        lm1.setLkm_name("黎活明");
        
        LinkMan lm2 = new LinkMan();
        lm2.setLkm_name(
"劉悅東"); //表達一對多,客戶下有多個聯系人 c.getLinkMens().add(lm1); c.getLinkMens().add(lm2); //表達對對對,聯系人屬於哪個客戶 lm1.setCustomer(c); lm2.setCustomer(c); session.save(c); session.save(lm1); session.save(lm2);

3、進階操作

  級聯操作

         <!-- 
             級聯操作:    cascade
                 save-update: 級聯保存更新
                 delete:級聯刪除
                 all:save-update+delete
             級聯操作: 簡化操作.目的就是為了少些兩行代碼.
          -->
        <set name="linkMens" inverse="true" cascade="delete"  >
            <key column="lkm_cust_id" ></key>
            <one-to-many class="LinkMan" />
        </set>

  結論: 簡化操作.一定要用,save-update,不建議使用delete.

  關系維護

  技術分享

  在保存時.兩方都會維護外鍵關系.關系維護兩次,冗余了. 多余的維護關系語句,顯然是客戶這一端在維護關系

          <!-- inverse屬性: 配置關系是否維護. 
                  true: customer不維護關系
                  false(默認值): customer維護關系
                  
              inverse屬性: 性能優化.提高關系維護的性能.
              原則: 無論怎麽放棄,總有一方必須要維護關系.
              一對多關系中: 一的一方放棄.也只能一的一方放棄.多的一方不能放棄.
          -->
        <set name="linkMens" inverse="true" cascade="delete"  >
            <key column="lkm_cust_id" ></key>
            <one-to-many class="LinkMan" />
        </set>

二、多對多

1、關系表達

 表中的表達

  技術分享

  對象中

  技術分享

  orm元數據

        <!-- 多對多關系表達 -->
        <!-- 
            name: 集合屬性名
            table: 配置中間表名
            key
             |-column:外鍵,別人引用"我"的外鍵列名
             class: 我與哪個類是多對多關系
             column:外鍵.我引用比人的外鍵列名
         -->
         <!-- cascade級聯操作:
                     save-update: 級聯保存更新
                     delete:級聯刪除
                     all:級聯保存更新+級聯刪除
             結論: cascade簡化代碼書寫.該屬性使不使用無所謂. 建議要用只用save-update.
                  如果使用delete操作太過危險.尤其在多對多中.不建議使用.
                      -->
        <set name="roles" table="sys_user_role" cascade="save-update" >
            <key column="user_id" ></key>
            <many-to-many class="Role" column="role_id" ></many-to-many>
        </set>

2、操作

  操作關聯屬性

        //3> 用戶表達關系
        u1.getRoles().add(r1);
        u1.getRoles().add(r2);
        
        u2.getRoles().add(r1);
        u2.getRoles().add(r2);
        
        //4> 角色表達關系
        r1.getUsers().add(u1);
        r1.getUsers().add(u2);
        
        r2.getUsers().add(u1);
        r2.getUsers().add(u2);
        
        //5> 調用Save方法一次保存
        session.save(u1);
        session.save(u2);
        session.save(r1);
        session.save(r2);

3、操作進階

  inverse屬性

    <!-- 使用inverse屬性
            true: 放棄維護外鍵關系
            false(默認值):維護關系
            
        結論: 將來在開發中,如果遇到多對多關系.一定要選擇一方放棄維護關系.
             一般誰來放棄要看業務方向. 例如錄入員工時,需要為員工指定所屬角色.
             那麽業務方向就是由員工維護角色. 角色不需要維護與員工關系.角色放棄維護
         -->        
        <set name="users" table="sys_user_role" inverse="true" >
            <key column="role_id" ></key>
            <many-to-many class="User" column="user_id" ></many-to-many>
        </set>

  級聯屬性

  

         <!-- cascade級聯操作:
                     save-update: 級聯保存更新
                     delete:級聯刪除
                     all:級聯保存更新+級聯刪除
             結論: cascade簡化代碼書寫.該屬性使不使用無所謂. 建議要用只用save-update.
                  如果使用delete操作太過危險.尤其在多對多中.不建議使用.
                      -->
        <set name="roles" table="sys_user_role" cascade="save-update" >
            <key column="user_id" ></key>
            <many-to-many class="Role" column="role_id" ></many-to-many>
        </set>

三、練習:添加聯系人

技術分享

  servlet:

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1> 獲得參數並封裝LinkMan對象中
        LinkMan lm = new LinkMan();
        try {
            BeanUtils.populate(lm, request.getParameterMap());
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
        //2> 調用Service保存LinkMan對象
        lms .save(lm);
        //3> 重定向到LinkMan的列表(404)
        response.sendRedirect(request.getContextPath()+"/ListLinkManServlet");
    }

  service:

    private CustomerDao cd =new CustomerDaoImpl();
    private LinkManDao lmd = new LinkManDaoImpl();
    public void save(LinkMan lm) {
        //打開事務
        HibernateUtils.getCurrentSession().beginTransaction();
        
        try {
            //1 根據客戶id獲得客戶對象
            Long cust_id = lm.getCust_id();
            Customer c = cd.getById(cust_id);
            //2 將客戶放入LinkMan中表達關系
            lm.setCustomer(c);
            //3 保存LinkMan
            lmd.save(lm);
        } catch (Exception e) {
            e.printStackTrace();
            //回滾事務
            HibernateUtils.getCurrentSession().getTransaction().rollback();
        }
        //提交事務
        HibernateUtils.getCurrentSession().getTransaction().commit();
        
    }

  dao:

    public void save(LinkMan lm) {
        //1 獲得session
        Session session = HibernateUtils.getCurrentSession();
        session.save(lm);
    }

【JAVAEE學習筆記】hibernate03:多表操作,級聯練習:添加聯系人