zoukankan      html  css  js  c++  java
  • Hibernate知识点小结(三)-->一对多与多对多配置

    一、多表关系与多表设计

        1、多表关系
            一对一:
                表的设计原则(分表原则):
                    优化表的性能
                    基于语意化分表    
                    
                一对一的两张表 之间的关系怎么维护?
                    主外键
                    相同主键值
                        
            
            一对多:
                建表原则:
                    在一的一方有主键   主表
                    多的一方有与主表的主键相关联外键    从表
            
            多对多
                建表原则:
                    两种主表(业务表) 中间存在一张中间表
                    中间表内部维护两个外键
                    
                    中间表分为两种:
                        仅仅维护关系的中间表
                        不仅存在维护关系的外键 还有其他业务字段 例如:订单表     订单项表     商品表
                        
        2、多表设计
            根据业务设计表模型
            
            分析表的关系:    分方向  看一条(起始表)
            
            一对一设计:
                学生表            学籍表
            
            一对多设计:
                客户表            联系人表
                百度            张三
                jd                李四
                google            王武
                                赵六
                                田七
                                孙八
                                
            多对多设计(权限5张表):
                1、通过用户名和密码才能登陆
                2、系统有不同的职务
                3、不同的职务可以有不同的权限
                
                用户表            职务表(角色表)            权限表(菜单表、功能表)    
                
                张三            CEO                        查下自己薪资
                李四            CTO                        查看全部人薪资
                王武            CFO                        请假
                田七            COO                        批假
                                程序员                    查看项目进度
                                                        查看项目金额
                                                        
                                                        
                    用户角色关系表            角色权限关系表
                


    二、hibernate一对多的配置(重点)
        基于的模型  客户与联系人
        
        1、创建实体:
            Customer实体
                private Long cust_id;
                private String cust_name;
                private String cust_source;
                private String cust_industry;
                private String cust_level;
                private String cust_phone;
                private String cust_mobile;
                
                //当前客户有哪些联系人  一个客户可以包含多个联系人
                private Set<Linkman> linkmans = new HashSet<>();
            
            
            Linkman实体
                private Long lkm_id;
                private String lkm_name;
                private String lkm_gender;
                private String lkm_phone;
                private String lkm_mobile;
                
                //private Long lkm_cust_id; //当前联系人属于哪一个客户
                private Customer customer;
                
        2、单实体的映射配置:
            Customer.hbm.xml
                <class name="com.itheima.domain.Customer" table="cst_customer">
                    <id name="cust_id">
                        <generator class="native"></generator>
                    </id>
                    <property name="cust_name"></property>
                    <property name="cust_source"></property>
                    <property name="cust_industry"></property>
                    <property name="cust_level"></property>
                    <property name="cust_phone"></property>
                    <property name="cust_mobile"></property>
                </class>
                    
            Linkman.hbm.xml
                <class name="com.itheima.domain.Linkman" table="cst_linkman">
                    <id name="lkm_id">
                        <generator class="native"></generator>
                    </id>
                    <property name="lkm_name"></property>
                    <property name="lkm_gender"></property>
                    <property name="lkm_phone"></property>
                    <property name="lkm_mobile"></property>
                </class>
                
        3、一对多映射关系的配置:
            Customer.hbm.xml
                <!--
                    配置一对多  一个Customer 对应多个 联系人
                    private Set<Linkman> linkmans = new HashSet<>();
                    
                    Set标签name属性:Set集合的名称     (当前实体使用哪个变量与对方维护关系)
                    key标签的column:外键的名称
                    one-to-many标签的class:对方的全限定名
                    
                 -->
                <set name="linkmans">
                    <key column="lkm_cust_id"></key>
                    <one-to-many class="com.itheima.domain.Linkman"/>
                </set>
            
            Linkman.hbm.xml
                <!--
                    配置多对一
                    private Customer customer;
                    
                        name:当前实体使用哪个变量与对方维护关系
                        class:对方的全限定
                        column:外键名称
                    
                 -->
                <many-to-one name="customer" class="com.itheima.domain.Customer" column="lkm_cust_id"></many-to-one>
            
        4、一对多的添加操作
            
            级联保存:在保存一方时 于此同时保存与该方有关系的其他对象
                cascade="save-update"
            级联删除:在删除一方时 于此同时删除与该方有关系的另一方
                cascade="delete"
                
            放弃外键维护权
                inverse="true"
                inverse直译:反转(反转外键维护权)        该方放弃外键维护权
                
            结论:
                在开发中 习惯在一的一方配置级联操作(cascade)  在一的一方配置放弃外键维护权(inverse="true")
                
                <set name="linkmans" cascade="save-update,delete" inverse="true">
                    <key column="lkm_cust_id"></key>
                    <one-to-many class="com.itheima.domain.Linkman"/>
                </set>
                
        5、查询
            
            知识点:延迟加载  lazy="true/false"  
            
            查询一的一方 多的一方默认是延迟加载


    三、hibernate多对多的配置
        
        模型配置:
            user 和 role
            
            User:
                private Long user_id;
                private String user_code;
                private String user_name;
                private String user_password;
                private String user_state;
                
                //当前该用户具备哪些角色
                private Set<Role> roles = new HashSet<>();
                
            Role:
                private Long role_id;
                private String role_name;
                private String role_memo;
                
                //当前该角色被哪些用户使用
                private Set<User> users = new HashSet<>();
                
            映射关系的配置:
                User.hbm.xml
                <set name="roles" table="sys_user_role">
                    <key column="uid"></key>
                    <many-to-many class="com.itheima.domain.Role" column="rid"></many-to-many>
                </set>
                
                Role.hbm.xml
                <set name="users" table="sys_user_role">
                    <key column="rid"></key>
                    <many-to-many class="com.itheima.domain.User" column="uid"></many-to-many>
                </set>
       


  • 相关阅读:
    把TXT GB2312文件转换成TXT UTF8文件
    把ANSI格式的TXT文件批量转换成UTF-8文件类型
    GB2312转换成UTF-8与utf_8转换成GB2312
    SQL 字符串处理函数大全
    编写一个程序,建立一个动态数组,为动态数组的元素赋值,显示动态数组的值并删除动态数组--简单
    设计一个使用常量成员函数的示范程序-简单
    声明一个复数类complex,使用友元函数add实现复数的加法-简单
    使用内联函数设计一个类,用来表示直角坐标系中的任意一条直线并输出它的属性
    设计一个点类point,再设计一个矩形类,矩形类使用point类的两个坐标点作为矩形的对角顶点,并可以输出4个坐标值和面积。使用测试程序验证程序。
    利用函数模板设计一人求数组元素总和的函数,并检验之-简单
  • 原文地址:https://www.cnblogs.com/itworkerlittlewrite/p/9448103.html
Copyright © 2011-2022 走看看