一、多表关系与多表设计

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. DJango小总结二

    1.Django请求的生命周期    武彦涛:        路由系统 -> 试图函数(获取模板+数据=>渲染) -> 字符串返回给用户        2.路由系统    王腾:   ...

  2. 将金额数字转换为大写汉字的js函数

    //将金额数字转换为大写汉字的函数 function convertCurrency(money) { //汉字的数字 var cnNums = new Array('零', '壹', '贰', '叁 ...

  3. IO流之转换流

    转换流 OutputStreamWriter类 查阅OutputStreamWriter的API介绍,OutputStreamWriter 是字符流通向字节流的桥梁:可使用指定的字符编码表,将要写入流 ...

  4. 前端使用express+node实现接口模拟及websocket通讯

    简述如何使用node+express实现接口连接及入门websocket通讯.使用技术栈:node + express + typescript + websocket. 1.接口实现 这里描述前端如 ...

  5. 【代码笔记】JTable 、TableModel的使用3

    在java中插入Table,并通过TableModel插入表格初始化状态后,如果需要第一行标题栏进行重命名,直接利用TableModel接口去实现列名修改,在图形显示中是无法实现的. 这里需要用到 J ...

  6. jQuery 添加样式属性的优先级别

    jQuery类中添加多个属性 $('#five .a') .css({ color:'blue', border:'2px solid green', background:'blue' }); jQ ...

  7. Android 多个activity之间的共享数据

    最近打算做一个时间助手,一个service监听课表信息.课表信息可以通过另外的activity来设置,所以这里就涉及到了数据的同步问题.我设置后的信息必须同步到监听的信息去. 在java中我们用全局变 ...

  8. 初学jboss

    1.简单安装-环境变量配置-创建控制台用户并访问控制台.   下载了windows版的jboss服务器(jboss-as-7.1.1.Final)     依赖JDK1.6以上版本,jdk环境变量等就 ...

  9. 【Leetcode】【Easy】Roman to Integer

    Given a roman numeral, convert it to an integer. Input is guaranteed to be within the range from 1 t ...

  10. React学习笔记 - 组件&Props

    React Learn Note 4 React学习笔记(四) 标签(空格分隔): React JavaScript 三.组件&Props 组件可以将UI切分成一些独立的.可复用的部件,这样你 ...