[TOC]

jpa关联关系

对象的关系有 一对一、一对多、多对一、多对多

jpa中实体对象也有着这四个关系,使用注解标记。

1、一对一

使用注解 @OneToOne

1
2
3
@OneToOne
@JoinColumn(name = "column_id")
private ExtraPointItemColumn column;

其中 @JoinColumn 注解用来标注是哪个外键。默认是 属性名加Id

2、一对多 和 多对一

一张试卷会有多个题目 , 那么

  • 对于试卷来说 , 他们的关系是 一(试卷)对多(题目)
  • 对于题目来说 , 他们的关系是 多(题目)对一(试卷)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
/**
* 测评表
* @author xia17
* @date 2020/7/27 10:29
*/
@Getter
@Setter
@Entity
@Table(name = "fdykh_eva_table")
public class EvaTable extends BaseEntity implements Serializable {


/**
* 主键
*/
@Id
@GenericGenerator(name = "snowFlake",strategy = "com.qx.yxy.ins.assessment.common.jpa.SnowFlakeIdGenerator")
@GeneratedValue(generator = "snowFlake")
private Long id;


/** 题目 **/
@OneToMany(mappedBy = "table", cascade = CascadeType.ALL)
@OrderBy("sort")
private List<EvaTableItem> items;

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
/**
* 测评表 题目
* @author xia17
* @date 2020/7/27 10:29
*/
@Getter
@Setter
@Entity
@Table(name = "fdykh_eva_table_item")
public class EvaTableItem extends BaseEntity implements Serializable , Cloneable<EvaTableItem> {


/**
* 主键
*/
@Id
@GenericGenerator(name = "snowFlake",strategy = "com.qx.yxy.ins.assessment.common.jpa.SnowFlakeIdGenerator")
@GeneratedValue(generator = "snowFlake")
private Long id;

/**
* 测评表
*/
@ManyToOne
@JsonIgnore
private EvaTable table;

/**
* 题目名
*/
@NotEmpty(message = "题目名不能为空")
private String name;

/** 分值 **/
@NotNull(message = "题目分值不能为空")
@DecimalMin(value = "0",message = "题目分值不能小于0")
private Double point;

/** 序号 **/
@NotNull(message = "序号不能为空")
private Integer sort;

}

@OneToMany 中的 mappedBy 对应的是关系对象 标记@ManyToOne的属性。

3、多对多 @ManyToMany

示例:

1
2
3
4
5
@ManyToMany
@JoinTable(name = "sys_users_jobs",
joinColumns = {@JoinColumn(name = "user_id",referencedColumnName = "user_id")},
inverseJoinColumns = {@JoinColumn(name = "job_id",referencedColumnName = "job_id")})
private Set<Job> jobs;

多对对一般意味着有一张中间表记录这 两个实体间的关系 。使用 @JoinTable注解来标识是哪张表。

name : 关系表的表名

joinColumns : 当前实体中的外键字段

inverseJoinColumns : 对应实体中的外键字段

4、FetchType

FetchType使用与关系关系中,有两种类型 , LAZY(懒加载) , EAGER(急加载)。

LAZY(懒加载) :当使用到该属性时才去查询数据库

EAGER(急加载):不管该属性是否使用都立即查询数据库

使用 LAZY 格式时需要注意,当你直接使用json序列化工具尝试序列化未加载的属性时会报错 。

5、排序 @OrderBy注解

常与ManyToOne注解一起使用,用于获取list属性时排序。

1
2
3

@OneToMany(mappedBy = "table", cascade = CascadeType.ALL)
@OrderBy("sort")