..

JPA#ManyToMany

多对多,多个学生选了多个课程。

 


 


涉及到的注解(注解的使用看注释):
ManyToMany
JoinTable
JsonIgnoreProperties

 


 

 

@Entity
@Table(name = "t_student")
public class Student {
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	@Column(name = "id")
	private Integer id;

	@Column(name = "name")
	private String name;

	
	/**
	 * 多对多映射关系中,需要一个中间表记录这种多对多的关系。
	 * 
	 * 中间表通过JoinTable.name定义中间表,表名称。
	 * 通过JoinTable.joinColumns定义一方的主键
	 * 通过JoinTable.inverseJoincolumns定义另一方的主键
	 * 
	 * 
	 * 在多对多的映射关系中,忽略某些字段的json序列化尤其特别重要,
	 * 否则就会产生大量的冗余数据。
	 * JsonIgnoreProperties注解,只会对被注解的属性的直接字段起作用,
	 * 比如下面的@JsonIgnoreProperties({"students"})作用于courses,
	 * 就会给course里面每一个course的students属性过滤掉,理解这一点显得尤其特别重要。
	 * 
	 * -----------------------------------------------------------------------------------
	 * 补充:
	 * 1.joinColumns用于定义当前表主键在关系表中的外键
	 * 2.inverseJoinColumns用于定义对方表的主键在关系表中的外键
	 * 3.多对多映射中对方表的字段,不用也写上JoinTable注解,只需要在ManyToMany注解中加入mappedBy并指定合适的值就行了
	 */
	@ManyToMany
	@JoinTable(
			name="t_course_student",
			joinColumns= {@JoinColumn(name="student_id")},
			inverseJoinColumns= {@JoinColumn(name="course_id")}
	)
	@JsonIgnoreProperties({"students"})
	private Set<Course> courses;
}

  

 

@Entity
@Table(name="t_course")
public class Course {
	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	@Column(name="id")
	private Integer id;
	
	@Column(name="name")
	private String name;
	
	
//  第一种写法	
//	@ManyToMany
//	@JoinTable(
//			name="t_course_student",
//			joinColumns= {@JoinColumn(name="course_id",referencedColumnName="id")},
//			inverseJoinColumns= {@JoinColumn(name="student_id")}
//			
//	)
//	@JsonIgnoreProperties({"courses","classroom"})
	
	
//  第二种写法	
	@ManyToMany(mappedBy="courses")
	@JsonIgnoreProperties({"courses","classroom"})
	private Set<Student> students;	
}

  

  

 

 

 

——

 

posted @ 2019-07-25 17:27  罗浩楠  阅读(702)  评论(0)    收藏  举报
..