一、多表关系与多表设计

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. BAT的java面试题

    公司:国内三巨头其中的一家!面试时间约在1月份左右!基本上都是在晚上,所以不影响白天上班! 一面 一面偏架构方面 1.介绍一下自己,讲讲项目经历 2.你们项目中微服务是怎么划分的,划分粒度怎么确定? ...

  2. 在 CentOS 上安装 node.js

    进入到 /usr/local/ 目录中: cd /usr/local/ 创建 nodejs 文件夹: mkdir -p nodejs 进入到 nodejs 目录中: cd nodejs 下载 node ...

  3. 解决C#调试ArcMap断点不能停的问题

    问题出在ArcMap bin\ArcMap.exe.config 默认是不支持NET4.0 <startup> <!--<supportedRuntime version=&q ...

  4. JavaScript基础入门知识

    JavaScript三种使用方式 JavaScript代码屏蔽 JavaScript内容显示的位置 JavaScript中的错误及解决方法 1.语法错误:通过控制台可以检查并解决. 2.逻辑错误:通过 ...

  5. Cloud Foundry和微服务Meetup重磅来袭

    CF 同学们: Cloud Foundry 2016 上海 Meetup 将在10月22日在上海港汇广场进行! 想要参会的小伙伴,请直戳  ~ 在过去的一年,CF 的技术有很多进展,微服务也是2016 ...

  6. solidity语言1

    合约(contract)由变量(variable).函数(functions).函数修饰符(function modifiers).事件(events).结构体类型(struct type).枚举类型 ...

  7. JavaScript模块化编程之AMD - requireJS基础使用

    JavaScript模块化编程之AMD requireJS基础使用 标签(空格分隔): JavaScript 参考文章 AMD规范 AMD是"Asynchronous Module Defi ...

  8. oozie调用java实例------shell action

    Oozie提供了一个方便的方式来运行任何命令.这可能是Unix命令,Perl或Python脚本,甚至java程序都可以通过Unix shell调用.shell命令运行在任意的Hadoop集群节点上,并 ...

  9. 设计模式——装饰模式(Decorator Pattern)

    装饰模式:动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活. UML图: 模型类: Component类: package com.cnblog.clarck; /** ...

  10. BZOJ1856:[SCOI2010]字符串(卡特兰数,组合数学)

    Description lxhgww最近接到了一个生成字符串的任务,任务需要他把n个1和m个0组成字符串,但是任务还要求在组成的字符串中,在任意的前k个字符中,1的个数不能少于0的个数.现在lxhgw ...