从零开始 Spring Boot 60:一个实体映射到多个表
在之前的文章中我们讨论了 JPA 中的一对一关系,实际上存在一种特殊的一对一关系,即将一个实体映射到多张表,本文会讨论这种关系。
我之前提过,有时候会因为性能上的考量将一张表拆分成多张表,虽然拆分后也可以用一对一关系来表示和实现,但这样并不是特别合适,因为一对一关系中一边的关系是可以为null
的,比如说一个学生对应一个电子邮件地址,也可能有的学生没有电子邮件地址,此时email
表可能就没有一条对应的数据。但如果是从同一张表上拆分出的两张表,必然存在一对一的关系,即使另一张表中的数据都是null
字段。
下面我们将说明如何实现这种关系。
示例
假设我们有一张表,保存学生的所有信息,这个表可以用下面的实体类表示:
@Entity
@Table(name = "student")
public class Student {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@NotNull
@NotBlank
@Length(max = 45)
private String name;
@NotNull
private Boolean loveMusic = false;
@NotNull
private Boolean loveDraw = false;
private String address;
private String email;
}
Hibernate 生成的表结构如下:
CREATE TABLE `student` (
`id` bigint NOT NULL AUTO_INCREMENT,
`name` varchar(45) NOT NULL,
`address` varchar(255) DEFAULT NULL,
`email` varchar(255) DEFAULT NULL,
`love_draw` bit(1) NOT NULL,
`love_music` bit(1) NOT NULL,
PRIMARY KEY (`id