zoukankan      html  css  js  c++  java
  • Hibernate-Lesson3

    一对多|多对一

    关系表达

    表中的表达

    实体中的表达

    orm元数据中表达

    一对多

    Customer.hbm.xml中

    <!-- 集合,一对多关系,在配置文件中配置 -->
    <!-- 
        name属性:集合属性名
        column属性: 外键列名
        class属性: 与我关联的对象完整类名
     -->
     <!-- 
        级联操作:    cascade
            save-update: 级联保存更新
            delete:级联删除
            all:save-update+delete
        级联操作: 简化操作.目的就是为了少些两行代码.
      -->
      <!-- inverse属性: 配置关系是否维护. 
            true: customer不维护关系
            false(默认值): customer维护关系
            
        inverse属性: 性能优化.提高关系维护的性能.
        原则: 无论怎么放弃,总有一方必须要维护关系.
        一对多关系中: 一的一方放弃.也只能一的一方放弃.多的一方不能放弃.
      -->
    <set name="linkMens" inverse="false"   >
        <key column="lkm_cust_id" ></key>
        <one-to-many class="LinkMan" />
    </set>

    多对一

    LinkMan.hbm.xml中

    <!-- 多对一 -->
    <!-- 
        name属性:引用属性名
        column属性: 外键列名
        class属性: 与我关联的对象完整类名
     -->
      <!-- 
        级联操作:    cascade
            save-update: 级联保存更新
            delete:级联删除
            all:save-update+delete
        级联操作: 简化操作.目的就是为了少些两行代码.
      -->
      <!-- 多的一方: 不能放弃维护关系的.外键字段就在多的一方.  -->
    <many-to-one name="customer" column="lkm_cust_id" class="Customer"  >
    </many-to-one>

    操作

    操作关联属性

    //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);

    进阶操作

    级联操作

    结论:简化操作.一定要用,save-update,不建议使用delete.

    关系维护

    在保存时.两方都会维护外键关系.关系维护两次,冗余了.
    多余的维护关系语句,显然是客户这一端在维护关系

    (见上文注释内容)

    多对多

    关系表达

    表中

    对象中

    orm元数据

    Userx.hbm.xml中

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

    操作

    操作关联属性

    //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);

    操作进阶

    inverse属性

    <!-- 使用inverse属性
        true: 放弃维护外键关系
        false(默认值):维护关系
        
    结论: 将来在开发中,如果遇到多对多关系.一定要选择一方放弃维护关系.
         一般谁来放弃要看业务方向. 例如录入员工时,需要为员工指定所属角色.
         那么业务方向就是由员工维护角色. 角色不需要维护与员工关系.角色放弃维护
     -->        
    <set name="users" table="sys_user_role" inverse="true" >
        <key column="role_id" ></key>
        <many-to-many class="Userx" column="user_id" ></many-to-many>
    </set>

    练习:添加联系人

    击石乃有火,不击元无烟!!
  • 相关阅读:
    GhostBSD 3.0RC3,基于GNOME的FreeBSD
    Nagios 3.4.3 发布,企业级监控系统
    Jolokia 1.0.6 发布, JMX远程访问方法
    微软希望开发人员不要使 WebKit 成为新版 IE6
    Kwort Linux 3.5 正式版发布
    EJDB 1.0.24 发布,嵌入式 JSON 数据库引擎
    Pale Moon 15.3 Firefox“苍月”优化版发布
    Galera Load Balancer 0.8.1 发布
    SmartSVN V7.5 正式发布
    PostgresQL建立索引如何避免写数据锁定
  • 原文地址:https://www.cnblogs.com/rain2020/p/12852854.html
Copyright © 2011-2022 走看看