ORM: 表关系 映射到 实体类关系

1. 表关系回顾:

一对一
一对多:
一的一方:主表
多的一方:从表
外键:需要在从表上新建一列作为外键,他的取值来源于主表的主键
多对多:
中间表:中间表中最少应该由两个字段组成,这两个字段做为外键指向两张表的主键,又组成了联合主键

2. 通过实体类表达表关系

讲师对学员:一对多关系

实体类中的关系

  • 包含关系:可以通过实体类中的包含关系描述表关系
  • 继承关系

分析步骤

  1. 明确表关系 (一对多,多对多 还是一对一)
  2. 确定表关系(描述 外键|中间表)
  3. 编写实体类,在实体类中描述表关系(包含关系)
  4. 配置映射关系

    一对多操作

    案例:客户和联系人的案例(一对多关系)
  • 客户:一家公司
  • 联系人:这家公司的员工
  • 一个客户可以具有多个联系人

分析步骤

  1. 明确表关系: 一对多关系,一个客户可以具有多个联系人
  2. 确定表关系(描述 外键|中间表)

    主表:客户表

    1. /*创建客户表*/
    2. CREATE TABLE cst_customer (
    3. cust_id bigint(32) NOT NULL AUTO_INCREMENT COMMENT '客户编号(主键)',
    4. cust_name varchar(32) NOT NULL COMMENT '客户名称(公司名称)',
    5. cust_source varchar(32) DEFAULT NULL COMMENT '客户信息来源',
    6. cust_industry varchar(32) DEFAULT NULL COMMENT '客户所属行业',
    7. cust_level varchar(32) DEFAULT NULL COMMENT '客户级别',
    8. cust_address varchar(128) DEFAULT NULL COMMENT '客户联系地址',
    9. cust_phone varchar(64) DEFAULT NULL COMMENT '客户联系电话',
    10. PRIMARY KEY (`cust_id`)
    11. ) ENGINE=InnoDB AUTO_INCREMENT=94 DEFAULT CHARSET=utf8;

    从表:联系人表
    * 再从表上添加外键

    1. /*创建联系人表*/
    2. CREATE TABLE cst_linkman (
    3. lkm_id bigint(32) NOT NULL AUTO_INCREMENT COMMENT '联系人编号(主键)',
    4. lkm_name varchar(16) DEFAULT NULL COMMENT '联系人姓名',
    5. lkm_gender char(1) DEFAULT NULL COMMENT '联系人性别',
    6. lkm_phone varchar(16) DEFAULT NULL COMMENT '联系人办公电话',
    7. lkm_mobile varchar(16) DEFAULT NULL COMMENT '联系人手机',
    8. lkm_email varchar(64) DEFAULT NULL COMMENT '联系人邮箱',
    9. lkm_position varchar(16) DEFAULT NULL COMMENT '联系人职位',
    10. lkm_memo varchar(512) DEFAULT NULL COMMENT '联系人备注',
    11. lkm_cust_id bigint(32) NOT NULL COMMENT '客户id(外键)',
    12. PRIMARY KEY (`lkm_id`),
    13. KEY `FK_cst_linkman_lkm_cust_id` (`lkm_cust_id`),
    14. CONSTRAINT `FK_cst_linkman_lkm_cust_id` FOREIGN KEY (`lkm_cust_id`) REFERENCES `cst_customer` (`cust_id`) ON DELETE NO ACTION ON UPDATE NO ACTION
    15. ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
  3. 编写实体类,在实体类中描述表关系(包含关系)

  • 客户:在客户的实体类中包含一个联系人的集合

    1. @Entity
    2. @Table(name="cst_customer")
    3. public class Customer {
    4. @Id
    5. @GeneratedValue(strategy = GenerationType.IDENTITY)
    6. @Column(name="cust_id")
    7. private Long custId;
    8. @Column(name="cust_address")
    9. private String custAddress;
    10. @Column(name="cust_industry")
    11. private String custIndustry;
    12. @Column(name="cust_level")
    13. private String custLevel;
    14. @Column(name="cust_name")
    15. private String custName;
    16. @Column(name="cust_phone")
    17. private String custPhone;
    18. @Column(name="cust_source")
    19. private String custSource;
    20. private Set<LinkMan> linkMans = new HashSet<>();
    21. }
  • 联系人:在联系人的实体类中包含一个客户的对象

    1. @Entity
    2. @Table(name = "cst_linkman")
    3. public class LinkMan {
    4. @Id
    5. @GeneratedValue(strategy = GenerationType.IDENTITY)
    6. @Column(name = "lkm_id")
    7. private Long lkmId; //联系人编号(主键)
    8. @Column(name = "lkm_name")
    9. private String lkmName;//联系人姓名
    10. @Column(name = "lkm_gender")
    11. private String lkmGender;//联系人性别
    12. @Column(name = "lkm_phone")
    13. private String lkmPhone;//联系人办公电话
    14. @Column(name = "lkm_mobile")
    15. private String lkmMobile;//联系人手机
    16. @Column(name = "lkm_email")
    17. private String lkmEmail;//联系人邮箱
    18. @Column(name = "lkm_position")
    19. private String lkmPosition;//联系人职位
    20. @Column(name = "lkm_memo")
    21. private String lkmMemo;//联系人备注
    22. private Customer customer;
    23. }
  1. 配置映射关系: 使用jpa注解配置一对多映射关系
  • 级联 - 操作一个对象的同时也操作它的关联对象
  • 级联操作:

    1. 需要区分操作主体
    2. 需要在操作主体的实体类上,添加级联属性(需要添加到多表映射关系的注解上)
    3. cascade(配置级联)
      • 级联添加 - 案例:当我保存一个客户的同时保存联系人
      • 级联删除 - 案例:当我删除一个客户的同时删除此客户的所有联系人

        多对多操作

        案例:用户和角色(多对多关系)
        用户:
        角色:

    分析步骤
    1.明确表关系
    多对多关系
    2.确定表关系(描述 外键|中间表)
    中间间表
    3.编写实体类,再实体类中描述表关系(包含关系)
    用户:包含角色的集合
    角色:包含用户的集合
    4.配置映射关系