多对多只有双向关系(如果添加一张辅助表来存储多对多的单向关系也可以,但是不值得
这么做,因为多对多的单向关系可以用多对一或者一对多的半向关系来表达,不必要添加一张
辅助表),如学生与课程之间,一个学生对应多个课程,一个课程也可以被多个学生选择。
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"的那一方)。
posted on 2007-12-29 15:01
Ke 阅读(2000)
评论(0) 编辑 收藏 所属分类:
hibernate