JPA#OneToMany


一對多,反過來就是,多對一。在進行一對多的映射中,往往也要處理多對一。


 

涉及到的注解(注解的使用看代碼注釋):

  • OneToMany
  • ManyToOne
  • 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;

	/**
	 * Student 和 Classroom是多對一的關系所以用到了ManyToOne注解。
	 * 
	 * 因此每一個Student實例也都有一個classroom實例,
	 * 所以student對應的數據庫表個也就需要一個外鍵來關聯classroom實例(通過JoinColumn.name),
	 * 同時通過JoinColumn.referencedColumnName來指出外鍵對應的主鍵名稱。
	 * 
	 */
	@ManyToOne
	@JoinColumn(name="classroom_id",referencedColumnName="id")
	@JsonIgnoreProperties(value="students")
	private Classroom classroom;
	
	@Override
	public String toString() {
		return ReflectionToStringBuilder.toString(this, ToStringStyle.MULTI_LINE_STYLE);
	}
}

  

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

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

	/**
	 * 一個教室里面有多個學生,因此用到了OneToMany注解,所以Classroom實體類中就有了一個學生的集合屬性。
	 * 集合就是多個值組成的屬性,因此通過JoinColumn來定義一個外鍵的方式就行不通了。
	 * 
	 * 這里通過OneToMany.mappedBy來指出集合(students)中每一個元素(student)的classroom屬性,通過classroom屬性
	 * 來連接(或稱為映射)一個教室和多個學生之間的關系。
	 * 
	 * 通過JsonIgnoreProperties注解避免出現序列化時候的死循環
	 */
	@OneToMany(mappedBy="classroom")
	@JsonIgnoreProperties(value="classroom")
	private List<Student> students;
}

  

 

 

_

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM