需中間關聯表 STUDENT_TEACHER,雙向導航。
// Student 端
@ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE}, fetch = FetchType.EAGER)
@JoinTable(
name = "STUDENT_TEACHER",
joinColumns = @JoinColumn(name = "STUDENT_ID"),
inverseJoinColumns = @JoinColumn(name = "TEACHER_ID")
)
public Set<Teacher> getTeachers() { return teachers; }
// Teacher 端
@ManyToMany(mappedBy = "teachers")
public Set<Student> getStudents() { return students; }
單向或雙向,外鍵置於任一端。
// Student 端(擁有外鍵)
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "DOSSIER_ID")
public Dossier getDossier() { return dossier; }
// Dossier 端(雙向時)
@OneToOne(mappedBy = "dossier")
public Student getStudent() { return student; }
| 關係 | 擁有端註解 | 被擁有端註解 | 資料表結構 |
|---|---|---|---|
| 多對多 | @ManyToMany + @JoinTable | @ManyToMany(mappedBy=...) | 中間表 |
| 一對一 | @OneToOne + @JoinColumn | @OneToOne(mappedBy=...) | 外鍵在擁有端 |
Student、Teacher、DossierEntityTestBean 建立測試資料mappedBy 導致產生兩張中間表或重複外鍵。cascade = ALL 可能誤刪關聯另一端資料,需謹慎評估。