多對多只有雙向關系(如果添加一張輔助表來存儲多對多的單向關系也可以,但是不值得
這么做,因為多對多的單向關系可以用多對一或者一對多的半向關系來表達,不必要添加一張
輔助表),如學生與課程之間,一個學生對應多個課程,一個課程也可以被多個學生選擇。
Student.hbm.xml
...
<hibernate-mapping>
<class name="model.Student" table="student">
<id name="id" unsaved-value="null">
<generator class="uuid.hex"/>
</id>
<property name="name" type="string"/>
<set name="courses"
table="student_course"
cascade="save-update"
>
<key column="stu_id"/>
<many-to-many class="model.Course
column="course_id"/>
</set>
<class>
</hibernate-mapping>
多對多關系需要配置的屬性比較多一些。初學者經常會把<key column=""/>和<column="">的值
弄反了,其實只要記住一個原則:<key column="">總是和本身類的主鍵id對應,而<column="">
總是與關聯類的主鍵id相對應。對于上面的Student.hbm.xml,關聯類是Course,本身類則是Student
Course.hbm.xml
...
<hibernate-mapping>
<class name="model.Course" table="course">
<id name="id" unsaved-value="null">
<generator class="uuid.hex"/>
</id>
<propery name="name" type="string"/>
<set name="students"
table="student_course"
cascade="save-update"
>
<key columm="course_id"/>
<many-to-many class="model.Student"
column="stu_id"/>
</set>
</class>
</hibernate-mapping>
注意:Student與Course的cascade都設置為save-update,在多對多的關系中,all,delete等
cascade是沒有意義的,因為多對多關系中,并不能因為父對象被刪除,而造成被包括的子對象
被刪除,因為可能還有其他的父對象參考了這個子對象。
另外,在多對多關系中,如果雙方都有控制權(也就是雙方都沒有設置inverse="true"),則
雙方都要把關聯關系反映到數據庫。必須在某一方設置inverse="true",然后在執行語句時使用
主控方進行操作(也就是沒有設置inverse="true"的那一方)。