一、多表关系与多表设计

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. shell命令修改文件内容

    有个 test.txt 文件内容为  hello tom,现在修改成 hello jerry,并保存到test2.txt sed 's/tom/jerry/g' test.txt >test2. ...

  2. vue+rest-framework前后端分离整合(二)

    一.基于api前端显示课程详细信息 1.调整Course.vue模块 <template> <div> <h1>课程列表</h1> <div v- ...

  3. iDempiere 使用指南 库存出入库研究

    Created by 蓝色布鲁斯,QQ32876341,blog http://www.cnblogs.com/zzyan/ iDempiere官方中文wiki主页 http://wiki.idemp ...

  4. @PathVariable @RequestParam @RequestBody等参数绑定注解详解

    一.分类 handler method 参数绑定常用的注解,我们根据他们处理的Request的内容不同分为四类: 处理request uri 部分的注解:   @PathVariable;(这里指ur ...

  5. AS打包出现app:transformClassesAndResourcesWithProguardForRelease错误

    今天打包项目的正式签名APK出现以下错误,当时挺着急用的实在没办法就只能用测试apk凑合来对付一下了 Error:Execution failed for task ':app:transformCl ...

  6. 【转】dB的计算方法

    原文地址:https://www.espressif.com/zh-hans/media/blog/%E5%A2%9E%E7%9B%8A%E6%AF%94%E5%80%BC-db-%E4%BB%A5% ...

  7. 动态获取Drawable图片资源

    比如Drawable中有一系列连续的图片,img_0.png, img_1.png, img_2.png ... 如果要动态获取这些图片,通过"R.drawable.img_x"的 ...

  8. DevExpress控件水印文字提示 z

    ButtonEdit.Properties.NullValuePrompt = "提示"; ButtonEdit.Properties.NullValuePromptShowFor ...

  9. wmware共享磁盘redhat 5.8挂载问题

    需要修改参数vi /etc/sysconfig/selinux将SELINUX=enforcing改为SELINUX=disabled,这样重启服务器则不会启动selinux服务 不然重启虚拟机后共享 ...

  10. sql语句更新某字段内容中部分数据

    使用到的sql 语句的关键字就是replace, 如下图,把带有zhangjun 的值替换成 user 使用的sql语句就是 update 表名 set 字段名=replace(字段名,‘替换字符内容 ...