有两个类Student和Course,Student可以选择多门Course,一门Course可有以多个学生选择,在Hibernate中我的映射文件用的是多对多类型:
Student的映射文件(部分):
<set name="courses" table="stu_cou" inverse="true" cascade="all">
<key column="STU_ID" />
<many-to-many class="Course" column="COU_ID" />
</set>
Course的映射文件(部分):
<set name="students" table="stu_cou" >
<key column="COU_ID" />
<many-to-many class="Student" column="STU_ID" />
</set>
(表stu_cou为中间表,相当于选课记录,里面的两个字段STU_ID与COU_ID分别引用了Student的主键OID与Course的主键OID)
现在假设有三个学生stu1,stu2,stu3与三门课程cou1,cou2,cou3, stu1选择cou1,cou2,stu2选择cou1,cou3,stu3选择cou2,cou3。
在往数据库中存储学生时级联存储课程,这没有问题,但当我试图删除一个学生或课程时,就会报错,报错的原因我也明白。我现在的问题是如何配置映射文件,当我删除一个学生时仅在数据库中删除该学生以及该学生的选课记录,而不级联到该课程。或者当我删除一门课程,仅在数据库中删除涉及到该门课程的选课记录,而不级联到学生。
请高手指教!
Student的映射文件(部分):
<set name="courses" table="stu_cou" inverse="true" cascade="all">
<key column="STU_ID" />
<many-to-many class="Course" column="COU_ID" />
</set>
Course的映射文件(部分):
<set name="students" table="stu_cou" >
<key column="COU_ID" />
<many-to-many class="Student" column="STU_ID" />
</set>
(表stu_cou为中间表,相当于选课记录,里面的两个字段STU_ID与COU_ID分别引用了Student的主键OID与Course的主键OID)
现在假设有三个学生stu1,stu2,stu3与三门课程cou1,cou2,cou3, stu1选择cou1,cou2,stu2选择cou1,cou3,stu3选择cou2,cou3。
在往数据库中存储学生时级联存储课程,这没有问题,但当我试图删除一个学生或课程时,就会报错,报错的原因我也明白。我现在的问题是如何配置映射文件,当我删除一个学生时仅在数据库中删除该学生以及该学生的选课记录,而不级联到该课程。或者当我删除一门课程,仅在数据库中删除涉及到该门课程的选课记录,而不级联到学生。
请高手指教!
cascade可以=all,save-update,delete,none,delete-orphan,具体用法你google一下吧。
mysql> select * from stu_cou;
+--------+--------+
| STU_ID | COU_ID |
+--------+--------+
| 1 | 32768 |
| 3 | 32768 |
| 1 | 32769 |
| 2 | 32769 |
| 2 | 32770 |
| 3 | 32770 |
+--------+--------+
6 rows in set (0.00 sec)
mysql> select * from t_student;
+-----+--------+---------+
| OID | STU_ID | NAME |
+-----+--------+---------+
| 1 | s001 |liudehua |
| 2 | s002 |xusanduo |
| 3 | s003 |hujintao |
+-----+--------+---------+
3 rows in set (0.00 sec)
mysql> select * from t_course;
+-------+--------+-----------+
| OID | COU_ID | NAME |
+-------+--------+-----------+
| 32768 | c002 | hibernate |
| 32769 | c001 | core java |
| 32770 | c003 | sql |
+-------+--------+-----------+
3 rows in set (0.00 sec)表stu_cou分别引用了t_student表的OID和t_course的OID作为联合主键。
比如我试图删除学生s001,只要在数据库中删除t_student表中的s001记录以及stu_cou表中涉及s001学生的选课记录就行了,可是总是会报错:
Cannot delete or update a parent row: a foreign key constraint fails
(`test`.`stu_cou`, CONSTRAINT `FK8FFC34FE553D1216` FOREIGN KEY (`STU_ID`) REFERENCES `t_student` (`OID`))请问到底在映射文件中该怎么声明才能达到我的目的啊?