1. 程式人生 > >jpa關聯映射(一)

jpa關聯映射(一)

core 新建 -h class data hibernate ble 名稱 標記

開發中常用到數據表的關聯(其實很難遇到。。),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標註,你中有我,我中有你。

Score:

  @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關聯映射(一)