一、多表关系与多表设计

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>

Hibernate知识点小结(三)-->一对多与多对多配置的更多相关文章

  1. 2.1、Hibernate多表操作--一对多、多对一、多对多。

    一.什么是一对一.一对多.多对一及多对多关系(以简单的学生和老师的关系为例来说): 1.一对一:学生具有学号和姓名(假定没有同名的学生)这两个属性,那么我知道了学生的学号也就能找到对应的学生姓名,如果 ...

  2. Hibernate之关联映射(一对多和多对一映射,多对多映射)

    ~~~接着之前的Hibernate框架接着学习(上篇面试过后发现真的需要学习以下框架了,不然又被忽悠让去培训.)~~~ 1:Hibernate的关联映射,存在一对多和多对一映射,多对多映射: 1.1: ...

  3. Hibernate之关联关系映射(一对多和多对一映射,多对多映射)

    ~~~接着之前的Hibernate框架接着学习(上篇面试过后发现真的需要学习一下框架了,不然又被忽悠让去培训.)~~~ 1:Hibernate的关联映射,存在一对多和多对一映射,多对多映射: 1.1: ...

  4. hibernate一对多和多对一配置

    public class Dept { private int deptId; private String deptName; // [一对多] 部门对应的多个员工 private Set<E ...

  5. EF 一对一、一对多、多对多配置语句小记

    数据库实体间的关系无非有这么几种:一对一.一对多.多对多,这些关系在EF框架中分别有不同的创建方式: 1.在"Database First"模式中,这些关系通过SQL语句的方式建立 ...

  6. mybatis 一对多,多对一配置

    一. 简介: 本实例使用顾客和订单的例子做说明: 一个顾客可以有多个订单, 一个订单只对应一个顾客 二. 例子: 1. 代码结构图: 2. 建表语句: CREATE DATABASE test; US ...

  7. 面试题:hibernate第三天 一对多和多对多配置

    1.1 一对多XML关系映射 1.1.1 客户配置文件: <?xml version="1.0" encoding="UTF-8"?> <!D ...

  8. Hibernate(6)—— 一对多 和 多对多关联关系映射(xml和注解)总结

    俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及的知识点总结如下: One to Many 映射关系 多对一单向外键关联(XML/Annotation) 一对多单向外键关联(XM ...

  9. Hibernate知识点小结汇总

    Hibernate部分 1.为什么要使用Hibernate开发你的项目呢?Hibernate的开发流程是怎么样的? 为什么要使用 ①.对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复 ...

随机推荐

  1. WCF寄宿在C#控制台,并用命令行启动

    公司运用wcf比较多,所以自己研究一下寄宿做个笔记,wcf寄宿在控制台有两种方式 第一种,直接在控制台程序内添加wcf服务. 第二种分别添加控制台程序和wcf服务应用程序,前者引用后者,并在app.c ...

  2. Cookie的创建、读取、删除

    创建Cookie: HttpCookie cookie =  new HttpCookie(COOKIE_NAME_FOR_USER);cookie.Expires = DateTime.Now.Ad ...

  3. 02.for循环

    语法: for(表达式1;表达式2;表达式3) { 循环体; } 练习1: namespace _02.for循环的练习01 { class Program { static void Main(st ...

  4. PHP file_put_contents() 函数

    file_put_contents() 函数把一个字符串写入文件中. 与依次调用 fopen(),fwrite() 以及 fclose() 功能一样. 语法如下 file_put_contents(f ...

  5. struts2的基本配置

    1.package标签下主要的点在namespace和name,extend上 extend 一般继承自struts-default.xml下,继承其拦截器及一些功能,这个已在本人的拦截器一文中有讲到 ...

  6. Linux - centos 7 mysql安装

    安装 CentOS Linux release 7.1.1503 (Core)下载地址链接:https://pan.baidu.com/s/1c2rWsbm 密码:5nrt #yum -y insta ...

  7. <Android 基础(十八)> XLIFF

    介绍 XLIFF ,XML Localization Interchange File Format,XML本地化数据交换格式. 实际使用 1.布局文件 activity_main.xml <? ...

  8. matlab练习程序(Arnold图像置乱)

    自从上次写了Hilbert图像置乱之后,就对图像置乱研究了一下,发现这里面也是有很多置乱算法的. Arnold也算一种比较主要的置乱算法,算法由以下变换公式产生: 这里a和b是参数,n是迭代次数,N是 ...

  9. C# 调用 Excel 宏的方法

    调用方式是使用 Microsoft.Office.Interop.Excel.dll 组件来调用,该组件可以通过 Excel.exe 来生成,具体步骤如下: 第一步,进入 visual Studio ...

  10. php xml字符串转数组

    function xmltoarr($path){//xml字符串转数组 $xmlfile = file_get_contents($path);//提取xml文档中的内容以字符串格式赋给变量 $ob ...