首先在"一"方類中增加一個集合屬性Student:
private Set students = new HashSet();public Set getStudents(){return student;}public void setStudents(set students){this.students = students;}
注意,hibernate要求在持久化中定義集合屬性時,必須把屬性聲明為介面類型,如java.util.Set、java.util.Map、java.util.List.之所以這樣做的原因是:當hibernate調用setStudents時,傳進去的參數是hibernate自己實現的Set介面的執行個體。如果把students聲明為HashSet類型,就強迫hibernate只能把hashSet類的執行個體傳遞給setStudents.
由於在school表中沒有直接與students屬性直接對應的欄位,因此不能用<property>元素來映射students屬性,而是要使用<set>元素:
<setname="students"cascade="save-update"><key column="school_id"/><one-to-many class="Student"/></set>
<set>中把inverse設為trueB表明School端的關聯只是Student端關聯的鏡像。當hibernate探測到持久化對象中School和Student端均發生變化時,僅按照Student對象屬性的變化來同步更新資料庫。
結論:
在映射一對多的雙向關聯時,應該在"one"的一方把<set>元素的inverse屬性設為true.這可以提高應用的效能。
在建立兩個對象的雙向關聯時,應該同時修改修改兩端對象的相應屬性:
student.setSchool(school);school.getStudents.add(student);
這樣可以提高程式的健壯性,邏輯也更加合理。使商務邏輯層的程式碼不受hibernate的影響。當解除雙向關聯的關係時,也應該修改兩端:
student.setSchool(null);school.getStudents.remove(student);