Home  >  Article  >  Java  >  Detailed explanation of multi-table operations in Javaee

Detailed explanation of multi-table operations in Javaee

零下一度
零下一度Original
2017-06-25 10:35:582307browse

One, one-to-many|many-to-one

1. Relationship expression

Expression in the table

 

 Expression in entity

 

 Expression in orm metadata

 One-to-many

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

Many-to-one

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

2. Operation

Operation associated attributes

        //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. Advanced operation

 Cascading operation

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

Conclusion: Simplified Operation. You must use save-update. It is not recommended to use delete.

Relationship maintenance

When saving, both parties The foreign key relationship will be maintained. The relationship is maintained twice, which is redundant. The redundant maintenance relationship statements are obviously the client's end maintaining the relationship

          <!-- 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>

2. Many-to-many

1. Relationship expression

Expression in the table

 

 Object

 

Orm metadata

        <!-- 多对多关系表达 --><!-- 
            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. Operation

Operation associated attributes

        //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. Operation advanced

 Inverse attribute

    <!-- 使用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>

 Cascading attribute

 

         <!-- 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>

3. Exercise: Add a contact

##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 获得sessionSession session = HibernateUtils.getCurrentSession();
        session.save(lm);
    }

The above is the detailed content of Detailed explanation of multi-table operations in Javaee. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn