目录

@OneToOne(一对一)

@OneToMany(一对多)

@ManyToOne(多对一)

@ManyToMany(多对多)


@JoinColumn 注解的作用:用来指定与所操作实体或实体集合相关联的数据库表中的列字段。

由于 @OneToOne(一对一)、@OneToMany(一对多)、@ManyToOne(多对一)、@ManyToMany(多对多) 等注解只能确定实体之间几对几的关联关系,它们并不能指定与实体相对应的数据库表中的关联字段,因此,需要与 @JoinColumn 注解来配合使用。

在此,我们以员工、地址、部门、角色四者之间的关联关系为例进行详细介绍,假设:
           1.一个员工只能有一个地址,同样的,一个地址也只属于一个员工;
           2.一个员工只能属于一个部门,但是一个部门可以包含有多个员工;
           3.一个员工可以拥有多个角色,同样的,一个角色也可以属于多个员工。

@OneToOne(一对一)

@OneToOne 用来表示类似于以上员工与地址之间的一对一的关系,在员工表中会有一个指向地址表主键的字段address_id,所以主控方(指能够主动改变关联关系的一方)一定是员工,因为,只要改变员工表的address_id就改变了员工与地址之间的关联关系,所以@JoinColumn要写在员工实体类Employee上,自然而然地,地址就是被控方了。

@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinColumn(name = "address_id")
private Address address;

我们也可以不写@JoinColumn,Hibernate会自动在员工表生成关联字段,字段默认的命名规则:被控方类名_被控方主键,如:address_id。

如果两张表是以主键关联的,比如员工表主键是employee_id,地址表主键是address_id,可以使用如下注解:

@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@PrimaryKeyJoinColumn(name = "employee_id", referencedColumnName = "address_id")
private Address address;

@OneToMany(一对多)

在分析员工与部门之间的关系时,一个员工只能属于一个部门,但是一个部门可以包含有多个员工,如果我们站在部门的角度来看,部门与员工之间就是一对多的关系,在部门实体类 Department 上添加如下注解:

@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinColumn(name = "department_id")
private List<Employee> employees;

我们也可以不写@JoinColumn,Hibernate会自动生成一张中间表来对员工和部门进行绑定,表名默认的命名规则:一的表名_一实体类中关联多的属性名,例如,部门表名为 tbl_department ,部门实体中关联的员工集合属性名为 employees ,则生成的中间表名为:tbl_department_employees。

通常并不推荐让Hibernate自动去自动生成中间表,而是使用@JoinTable注解来指定中间表:

@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
/**
* joinColumns 用来指定中间表中关联自己ID的字段
* inverseJoinColumns 用来指定中间表中关联对方ID的字段
*/
@JoinTable(name = "tbl_employee_department", joinColumns = {
@JoinColumn(name = "department_id") }, inverseJoinColumns = { @JoinColumn(name = "employee_id") })
private List<Employee> employees;

@ManyToOne(多对一)

如果我们站在员工的角度来看员工与部门之间的关系时,二者之间就变成了多对一的关系,在员工实体类 Employee 上添加如下注解:

@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinColumn(name = "department_id")
private Department department;

@ManyToMany(多对多)

类似员工与角色之间的关系,一个员工可以拥有多个角色,一个角色也可以属于多个员工,员工与角色之间就是多对多的关系。通常这种多对多关系都是通过创建中间表来进行关联处理,并使用@JoinTable注解来指定。

一个员工可以拥有多个角色,在员工实体类中添加如下注解:

@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinTable(name = "tbl_employee_role", joinColumns = { @JoinColumn(name = "employee_id") }, inverseJoinColumns = {
@JoinColumn(name = "role_id") })
private List<Role> roles;

一个角色可以属于多个员工,在角色实体类中添加如下注解:

@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinTable(name = "tbl_employee_role", joinColumns = { @JoinColumn(name = "role_id") }, inverseJoinColumns = {
@JoinColumn(name = "employee_id") })
private List<Employee> employees;

定义好的员工、地址、部门、角色四个实体类代码如下:

员工实体类。

@Entity
@Table(name = "tbl_employee") // 指定关联的数据库的表名
public class Employee {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id; // 主键IDprivate String name; // 姓名@DateTimeFormat(pattern = "yyyy-MM-dd")private LocalDate birthday; // 生日@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)@JoinColumn(name = "address_id")// @PrimaryKeyJoinColumn(name = "employee_id", referencedColumnName = "address_id")private Address address; // 地址@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)@JoinColumn(name = "department_id")private Department department; // 部门@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)@JoinTable(name = "tbl_employee_role", joinColumns = { @JoinColumn(name = "employee_id") }, inverseJoinColumns = {@JoinColumn(name = "role_id") })private List<Role> roles; // 角色// 此处省略get和set方法
}

地址实体类。

@Entity
@Table(name = "tbl_address")
public class Address {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id; // 主键IDprivate String province; // 省private String city; // 市private String district; // 区private String address; // 详细地址// 此处省略get和set方法}

部门实体类。

@Entity
@Table(name = "tbl_department")
public class Department {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id; // 主键IDprivate String name; // 部门名称@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)@JoinColumn(name = "department_id")/*** joinColumns 用来指定中间表中关联自己ID的字段 inverseJoinColumns 用来指定中间表中关联对方ID的字段*/// @JoinTable(name = "tbl_employee_department", joinColumns = {//       @JoinColumn(name = "department_id") }, inverseJoinColumns = { @JoinColumn(name = "employee_id") })private List<Employee> employees; // 部门员工// 此处省略get和set方法
}

角色实体类。

@Entity
@Table(name = "tbl_role")
public class Role {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id; // 主键IDprivate String name; // 角色名称@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)@JoinTable(name = "tbl_employee_role", joinColumns = { @JoinColumn(name = "role_id") }, inverseJoinColumns = {@JoinColumn(name = "employee_id") })private List<Employee> employees; // 拥有角色的员工// 此处省略get和set方法}

SpringBoot重点详解--@JoinColumn注解相关推荐

  1. SpringBoot重点详解--事件监听

    目录 自定义事件监听 Springboot 启动事件监听 Springboot 事件监听为 Bean 与 Bean 之间的消息通信提供支持:当一个 Bean 做完一件事以后,通知另一个 Bean 知晓 ...

  2. SpringBoot重点详解--使用Junit进行单元测试

    目录 添加依赖与配置 ApplicationContext测试 Environment测试 MockBean测试 Controller测试 情况一 情况二 方法一 方法二 本文将对在Springboo ...

  3. SpringBoot重点详解--整合hive-jdbc

    目录 添加依赖与配置 配置数据源与JdbcTemplate 使用DataSource操作 Hive 使用 JdbcTemplate 操作 Hive 启动测试 创建Hive表 查看Hive表 导入数据 ...

  4. SpringBoot重点详解--使用过滤器映射访问路径

    目录 添加Maven依赖 配置地址映射 MapsApplication应用启动类 MapsInitializeListener初始化监听器 MapsUtils工具类 MapsFilter过滤器 Map ...

  5. SpringBoot重点详解--dbcp2数据源配置

    目录 DBCP2详细的配置表 常用链接配置 数据源连接数量配置 事务属性配置 数据源连接健康状况检查 缓存语句 连接泄露回收 DBCP2详细的配置表 常用链接配置 参数 描述 username 传递给 ...

  6. SpringBoot重点详解--log4j.properties配置详解与实例

    ################################################################################ #①配置根Logger,其语法为: # ...

  7. SpringBoot教程(13) JUnit5详解 常用注解 BeforeEach BeforeAll ParameterizedTest RepeatedTest

    JUnit5详解 常用注解 BeforeEach BeforeAll ParameterizedTest RepeatedTest 一.前言 1. 引入test包 二.注解 三.测试案例 1. @Be ...

  8. SpringBoot @ConfigurationProperties详解

    文章目录 简介 添加依赖关系 一个简单的例子 属性嵌套 @ConfigurationProperties和@Bean 属性验证 属性转换 自定义Converter SpringBoot @Config ...

  9. SpringBoot配置详解

    SpringBoot配置详解 本文链接:http://blog.battcn.com/2018/04/22/springboot/v2-config-properties/ 上一篇介绍了SpringB ...

最新文章

  1. SAP IDoc E1EDP04 Z8 数据错误之对策
  2. Altium Designer旋转PCB、PCB中绕某点旋转
  3. 使用curl操作InfluxDB
  4. Unity Mono脚本 加密
  5. redis 一般启动几个 哨兵_Redis6.0主从、哨兵、集群搭建和原理
  6. SpringBoot、mysql配置PageHelper插件
  7. 小程序绘图工具painter-json文件绘制保存分享图-可点击任意元素触发函数
  8. Python报错SyntaxError: (unicode error) ‘utf-8‘ codec can‘t decode byte 0xc5 in position 0: invalid
  9. C语言课后习题(38)
  10. Windows 8已经支持的游戏开发框架
  11. python接收前端post数据_python实现通过flask和前端进行数据收发
  12. 双人贪吃蛇@botzone算法设计
  13. 【基于Proteus 8 Professional和Keil uVision5简单共阴极数码管点亮】
  14. 串行通信接口:RS-232、RS-485和RS-422简述
  15. Windows安装WSL详解
  16. java excel 表头_Java如何生成excel的表头可变的示例代码
  17. 反向题在测试问卷信效度_问卷信度效度检验
  18. 逻辑函数的描述工具介绍
  19. 嵌入式学习的几种线路图
  20. 从零搭建飞冰微前端项目《第三篇:搭建微应用》❤️

热门文章

  1. Tensorflow2.0入门教程12:自定义循环训练模型
  2. 单招软件职业技能测试,2018绵阳职业技术学院单独招生《软件技术》专业技能测试方案...
  3. 20190421期-盘分享资源简报
  4. android studio for mac怎么卸载,Mac上完美卸载Android studio
  5. 车牌识别系统连不上服务器怎么办,车牌识别系统出现故障的解决方法有哪些?...
  6. IOS 13.4.1如何绕过验证抓取fidd~HTTPS的数据。
  7. 邮政手机银行登录显示服务器忙,显示系统错误该怎么?
  8. mysql add trandata_OGG add trandata 到底做了什么
  9. vmware gsx server正确设置共享磁盘注意事项
  10. 计算机教育传播的规律,计算机网络引发教育传播变革的分析