一對多,反過來就是,多對一。在進行一對多的映射中,往往也要處理多對一。
涉及到的注解(注解的使用看代碼注釋):
- 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; }
_