[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
|
@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
|
@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")
|