欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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;