old:
@ManyToMany 注釋:表示此類是多對多關系的一邊,
mappedBy 屬性定義了
此類為雙向關系的維護端,
注意:mappedBy 屬性的值為
此關系的另一端的屬性名。
例如,在Student類中有如下方法:
被控方:
@ManyToMany
(fetch = FetchType.LAZY, mappedBy = "students")
public Set<Teacher> getTeachers() {
return teachers;
}
那么這里的“students”就是Teachers的一個屬性,通常應該是這樣的:
Set<Student> students;
另一端的getStudents方法如下所示:
主控方:
@ManyToMany
(cascade = CascadeType.PERSIST, fetch = FetchType.LAZY)
@JoinTable(
name = "Teacher_Student",
joinColumns = {@JoinColumn(name = "Teacher_ID", referencedColumnName = "teacherid")},
inverseJoinColumns = {@JoinColumn(name = "Student_ID", referencedColumnName ="studentid")}
)
public Set<Student> getStudents() {
return students;
}
@ManyToMany 注釋表示Teacher 是多對多關系的一端。
@
JoinTable 描述了多對多關系的數據表關系。
name 屬性指定
中間表名稱,
joinColumns 定義
中間表與Teacher 表的外鍵關系。
上面的代碼中,
中間表Teacher_Student的Teacher_ID 列是Teacher 表的主鍵列對應的外鍵列,
inverseJoinColumns 屬性定義了
中間表與另外一端(Student)的外鍵關系。
可以通過上面的定義看到有三個表學生表--老師表--老師學生中間表
以上提到主控方和被控方。。本人不贊同這種寫法:
理由是: 1.既然是多對多關系。。為什么還要分主動方和被動方?
2.為什么需要刪除老師后才級聯中間表。。。請注意:以上定義方法時,刪除學生是無法級聯刪除中間表的。
正確的寫法應該是兩邊都用主控方的寫法:
只是joinColumns和inverseJoinColumns屬性的地方互換就可以了
new:
總結:
@ManyToMany(cascade = CascadeType.PERSIST, fetch = FetchType.LAZY)
@JoinTable(
name = "Teacher_Student",
joinColumns = {@JoinColumn(name = "Student_ID", referencedColumnName = "studentid")},
inverseJoinColumns = {@JoinColumn(name = "Teacher_ID", referencedColumnName ="teacherid")}
)
public Set<Teacher> getTeachers() {
return teachers;
}
@ManyToMany(cascade = CascadeType.PERSIST, fetch = FetchType.LAZY)
@JoinTable(
name = "Teacher_Student",
joinColumns = {@JoinColumn(name = "Teacher_ID", referencedColumnName = "teacherid")},
inverseJoinColumns = {@JoinColumn(name = "Student_ID", referencedColumnName ="studentid")}
)
public Set<Student> getStudents() {
return students;
}
2017-08-15 10:24:43