jpa關聯映射(一)
開發中常用到數據表的關聯(其實很難遇到。。),spring-data-jpa(其實是hibernate)提供了一整套十分方便的註解來供我們使用表關聯功能。
OneToOne
OneToMany
ManyToOne
ManyToMany
舉例之前,先理解兩個表的關系中,哪一個是主體,一對一以及多對多需要自己按照現實場景來區分,而一對多和多對一始終是以多的一方為主體的。註解在使用中“始終在非主體的一方標記自己在主體中的名稱”。
理解上面一段話,那麽操作也會變得很簡單。
開始前,把我們之前測試的Student表的主鍵生成策略改成自增,需要新增一些實體,ER圖如下:
一對一
Student和Score是一對一的關系,Score類如下:
@Entity
@Table(name = "score")
public class Score {
@Id
@GeneratedValue
private Integer id;
@Column(name = "chinese_score")
private Integer chinese;
@Column(name = "math_score")
private Integer math;
//省略get/set
}
現在開始建立它和Student的關系,首先在Student類中加入元素Score,在Score類中也加入元素Student,並都用OneToOne標註,你中有我,我中有你。
@OneToOne
private Student student;
Student:
@OneToOne
private Score score;
然後我們需要區分誰是主體,按照現實理解,肯定是Student,於是我們需要在非主體的那個類中標註出它在主體中的名字,也就是在Score類中標註它在Student類中的名字:
@OneToOne(mappedBy = "score")
private Student student;
此外,我們還可以設置映射級聯,只需要在註解中增加參數(千萬要註意必須在主體一側):
@OneToOne(cascade = CascadeType.REMOVE )
private Score score;
當student刪除的時候,score對應也會刪除。其他可以參看CascadeType類。
一對多(多對一)
現在我們開始建立student和school的關系,根據我們開始說的,student肯定是主體,那麽我們只需要在school中標註出它在student中的名稱就好了。建立School類:
@Entity
@Table(name = "school")
public class School {
@Id
@GeneratedValue
private Integer id;
private String name;
//省略get/set
}
在Student類中加入School,並且指定關系是多對一
@ManyToOne
private School school;
在School中建立Student集合,指定關系是一對多,並且申明它在Student類中的名稱
@OneToMany(mappedBy = "school")
private List<Student> students;
多對多
看到現在,大概也能知道多對多怎麽設置了,我們新建Subject
@Entity
@Table(name = "subject")
public class Subject {
@Id
@GeneratedValue
private Integer id;
@Column(length = 10)
private String name;
//省略get/set
}
分析可以知道,Student仍然是關系的主題,所以我們需要在Subject類中標註它在Student類中的名稱。
Student:
@ManyToMany
private List<Subject> subjects;
Subject:
@ManyToMany(mappedBy = "subjects")
private List<Student> students;
jpa關聯映射(一)