1...表与表之间的关系
一对一: A B 两张表 A表中的每条的记录对应的B的一条记录
:一对一关系实现方式:
1:使用外键关联
: 场景:使用客户表和客户拓展表
:在属性上 添加一个@OneToOne代表一个对一个的关系 在属性上添加@JoinColumn name 存储外键的字段 referencedColumnNm 对方表的字段名称 (可以省略)
2:使用主键关联,两个表 A B 的主键相同。
: 使用@PrimaryKeyJoinColumn 注解不需要配置属性 双方都需要添加
一对多: A B 两张表 A表中的每条的记录对应B表中多条的记录 B表中多条的记录对应A表中一条记录
:场景:客户和联系人之间 一对多 一个客户对应多个联系人
:单方:1 添加一个属性 记录多的一方的信息 应该是一个集合 hashset 2 在属性上添加一个注解 @OneToMany 3一定是多的一方记录外键 参照一的一方的主键
:多方:1 在属性上添加 注解 @ManyToOne 2 在属性上添加 @joinColumn 注解
多对多: A B 两张表 A表中的每条的记录对应B表中多条的记录 B表中的每条记录对应A表中的多条记录
:应用场景 用户和角色的关系 用户 角色 关系为例 CRM(客户关系管理)
多对多使用注解@ManyToMany配置
a 在实体中添加一个集合属性
b 在属性上添加ManyToMany注解
c:@JoinTable 注解配置关联关系
name 中间表的名称
当前表和中间表的映射关系
对方表和中间映射表的关系
多对多关系中 只能一方维护关联关系 另一方放弃维护
配置级联操作
@ManyToMnay注解中 配置cascade属性
关联查询
1 使用导航的方式查询 重难点
使用“对象.属性” 进行查询
对于多的查询 默认就是延迟加载 添加注解@Transactional
在OneToMany 注解中需要添加属性 fetch
值:FetchType.LAZY 延迟加载
FetchType.EAGER 及时加载
通过联系人 查询客户
对一的查询默认是及时加载
也可以配置成延时加载
具体实现:简单案例:
1....pom.xml 与 applicationContext.xml 请看 表与表关联 一对多 表与表关联 一对一
2....实体类
User 类
1 package com.wsc.core.entity; 2 3 import javax.persistence.*; 4 import java.io.Serializable; 5 import java.util.HashSet; 6 import java.util.Set; 7 8 /** 9 * @version 1.0 10 * @ClassName User 11 * @Description TODO 12 * @Author WSC 13 * @Date 2019/8/21 9:55 14 **/ 15 @Entity 16 @Table(name="user") 17 public class User implements Serializable { //实现序列化 18 @Id 19 @GeneratedValue(strategy = GenerationType.IDENTITY) 20 @Column(name="user_id") 21 private long userId; 22 @Column(name="username") 23 private String username; 24 @Column(name="password") 25 private String password; 26 //多对多关联关系 配置cascade属性 27 // FetchType.LAZY 延迟加载 28 // FetchType.EAGER 及时加载 29 @ManyToMany(cascade = CascadeType.ALL,fetch = FetchType.EAGER) 30 // 注解配置关联关系 31 // name 中间表的名称 32 // joinColumns 当前表和中间表的映射关系 33 // inverseJoinColumns 对方表和中间映射表的关系 34 35 @