Rumah > Java > javaTutorial > javaee中多表操作详解

javaee中多表操作详解

零下一度
Lepaskan: 2017-06-25 10:35:58
asal
2433 orang telah melayarinya

一、一对多|多对一

1、关系表达

 表中的表达

  

  实体中的表达

  

  orm元数据中表达

    一对多

        <!-- 集合,一对多关系,在配置文件中配置 --><!-- 
            name属性:集合属性名
            column属性: 外键列名
            class属性: 与我关联的对象完整类名         --><set name="linkMens" inverse="true" cascade="delete"  ><key column="lkm_cust_id" ></key><one-to-many class="LinkMan" /></set>
Salin selepas log masuk

    多对一

        <!-- 多对一 --><!-- 
            name属性:引用属性名
            column属性: 外键列名
            class属性: 与我关联的对象完整类名         --><many-to-one name="customer" column="lkm_cust_id" class="Customer"  ></many-to-one>
Salin selepas log masuk

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);
Salin selepas log masuk

3、进阶操作

  级联操作

         <span style="color: #008000"><!--</span><span style="color: #008000"> 
             级联操作:    cascade
                 save-update: 级联保存更新
                 delete:级联删除
                 all:save-update+delete
             级联操作: 简化操作.目的就是为了少些两行代码.          </span><span style="color: #008000">--><br></span>
Salin selepas log masuk
        <set name="linkMens" inverse="true" cascade="delete"  ><key column="lkm_cust_id" ></key><one-to-many class="LinkMan" /></set>
Salin selepas log masuk

  结论: 简化操作.一定要用,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>
Salin selepas log masuk

 

二、多对多

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>
Salin selepas log masuk

 

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);
Salin selepas log masuk

 

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>
Salin selepas log masuk

  级联属性

  

         <!-- 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>
Salin selepas log masuk

 

三、练习:添加联系人

  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");
    }
Salin selepas log masuk

 

  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();
        
    }
Salin selepas log masuk

  dao:

    public void save(LinkMan lm) {//1 获得sessionSession session = HibernateUtils.getCurrentSession();
        session.save(lm);
    }
Salin selepas log masuk

 

Atas ialah kandungan terperinci javaee中多表操作详解. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan