Spring Data JPA 高级(实现一对多、多对一、多对多)关联
程序员文章站
2022-04-23 23:39:56
...
单向一对多关联关系
以学生表和班级表为例
//班级实体类
@Data
@Entity
@Table(name = "class")
public class Clazz {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private String cname;
// 一对多
// 存放所有学生
// 懒加载fetch 级联加载cascade
@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL) // 什么时候用什么时候加载
// 关联列 name外键列 referencedColumnName主表里的id
@JoinColumn(name = "cid", referencedColumnName = "id")
private List<Student> stus;
}
//学生实体类
@Data
@Entity
@Table(name = "studentdb")
public class Student {
@Id//实体类的主键
@GeneratedValue(strategy = GenerationType.IDENTITY)//自动增长列
private Integer id;//id
private String name;//姓名
private String age;//年龄
}
1. @OneToMany 表示该列为一对多关系列;
2.fetch 表示该实体的加载方式,有两种:LAZY 和 EAGER,懒加载和立即加载;其中,如果所需数据不是必须立即呈现的话,可以设置成懒加载的方式,什么时候需要,什么时候加载。立即加载的方式,会立马呈现出所需的数据。比如:查询班级信息的时候,如果立马需要学生信息的话,可以使用成立即加载;如果暂时不需要学生信息的话,可以使用懒加载。
3. cascade 表示与此实体一对一关联的实体的联级样式类型。联级样式上当对实体进行操作时的策略。
说明:在定义关系时经常会涉及是否定义 Cascade(级联处理)属性,担心造成负面影响。 不定义,则对关系表不会产生任何影响
- CascadeType.PERSIST (级联新建)
- CascadeType.REMOVE (级联删除)
- CascadeType.REFRESH (级联刷新)
- CascadeType.MERGE (级联更新)
- CascadeType.ALL ,表示选择全部四项
- targetEntity 表示默认关联的实体类型,默认为当前标注的实体类;
4. mappedBy 属性用于双向关联实体时使用,在一的一方进行声明,表示自己不是一对多的关系维护端,
由对方来维护。取值应该为多的一方的外键列对应的属性名。
5. @JoinColumn(name=“cid”,referencedColumnName=“id”)说明:
6. @JoinColumn:配置外键。name:设置外键的名字;referencedColumnName:参照主表的主键字段
名称。
单向多对一关联关系
//学生实体类
@Data
@Entity
@Table(name = "studentdb")
public class Student {
@Id//实体类的主键
@GeneratedValue(strategy = GenerationType.IDENTITY)//自动增长列
private Integer id;//id
private String name;//姓名
private String age;//年龄
// 多对一
@ManyToOne(targetEntity = Clazz.class,cascade = CascadeType.ALL,fetch = FetchType.EAGER)
// 关联列 name外键列 referencedColumnName主表里的id
@JoinColumn(name = "cid",referencedColumnName = "id")
private Clazz clazz;
}
//班级实体类
@Data
@Entity
@Table(name = "class")
public class Clazz {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private String cname;
}
多对多关联
//班级实体类
@Data
@Entity
@Table(name = "class")
public class Clazz {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private String cname;
// 多对多
@JsonIgnore
// 学生表中班级的字段clazz
@OneToMany(mappedBy = "clazz",fetch = FetchType.EAGER,cascade = CascadeType.ALL)
private List<Student> stu;
}
//学生实体类
@Data
@Entity
@Table(name = "studentdb")
public class Student {
@Id//实体类的主键
@GeneratedValue(strategy = GenerationType.IDENTITY)//自动增长列
private Integer id;//id
private String name;//姓名
private String age;//年龄
// 多对多
// @JsonIgnore 学生和班级只需要一个
@ManyToOne(targetEntity = Clazz.class)
@JoinColumn(name = "cid")//副表中的外键字段名称
private Clazz clazz;
上一篇: 反射实例:ORM搭建
下一篇: mysql多实例的搭建