1. 程式人生 > >關係/物件對映 多對多關係(@ManyToMany 註釋)【

關係/物件對映 多對多關係(@ManyToMany 註釋)【

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;
}