zoukankan      html  css  js  c++  java
  • JAVAEE学习——hibernate03:多表操作详解、级联、关系维护和练习:添加联系人

    一、一对多|多对一

    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);
        }
  • 相关阅读:
    SQL语句建表、设置主键、外键、check、default、unique约束
    郝斌老师的SQL教程
    Hello WPF!
    指针
    穷举法破解 zebrone1.1
    一条汇编指令引发的 蝴蝶效应 (后记)
    浮点 汇编指令基础知识
    收敛数列极限唯一性证明
    MFC SkinMagic使用方法
    Python初学1
  • 原文地址:https://www.cnblogs.com/xieyupeng/p/6954271.html
Copyright © 2011-2022 走看看