论坛首页 Java版 Hibernate

多对多删除联带全删除了

浏览 2077 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
时间:2004-09-22
一个老师教许多学生,一个学生被许多老师教

class teacher{
String id;
String name;
Set students;
}
class student{
String id;
String name;
Set teachers;
}
[code:1]
<class name="net.fengrun.stu.Teacher" table="teachers">
<id name="id" type="integer" column="id">
<generator class="native"/>
</id>
<property name="name"/>
<set name="students" table="teacher_student" inverse="true" cascade="save-update" lazy="true">
<key column="teacherid"/>
<many-to-many column="studentid" class="net.fengrun.stu.Student"/>
</set>
</class>
<class name="net.fengrun.stu.Student" table="students">
<id name="id" type="integer" column="id">
<generator class="native"/>
</id>
<property name="name"/>
<set name="teachers" table="teacher_student" inverse="false" cascade="all" lazy="true">
<key column="studentid"/>
<many-to-many column="teacherid" class="net.fengrun.stu.Teacher"/>
</set>
</class>
[/code:1]

session.delete(teacher);

Hibernate: delete from teacher_student where studentid=?
Hibernate: delete from students where id=?
Hibernate: delete from teachers where id=?

怎么联student也被删除了?
如何解决?
   
时间:2004-09-22
试试看:

set name="students" inverse="false"
   
0 请登录后投票
时间:2004-09-22
set name="students" inverse="false"时

Hibernate: delete from teacher_student where teacherid=?
Hibernate: delete from teacher_student where studentid=?
Hibernate: delete from students where id=?
Hibernate: delete from teachers where id=?

反而多了一条!
   
0 请登录后投票
时间:2004-09-22
http://forum.javaeye.com/viewtopic.php?t=2641
   
0 请登录后投票
时间:2004-09-22
OH!
这个是 One2Many的情况

many-to-many的情况我再看看
   
0 请登录后投票
时间:2004-09-22
你的这个需求:
cascade="none"
就可以了
   
0 请登录后投票
时间:2004-09-22
cascade="none" 设置后:
session.delete(student)可以,
Hibernate: delete from student_book where studentid=?
Hibernate: delete from teacher_student where studentid=?
Hibernate: delete from students where id=?

session.delete(teacher)出错.
java.sql.SQLException: Integrity constraint violation FK2E2EF2DEE4EE687D table
   
0 请登录后投票
时间:2004-09-22
不知道你用的是什么数据库
[code:1]<id name="id" type="integer" column="id">
<generator class="native"/>
</id> [/code:1]
Teacher,Student类的ID都是String,这里设置type="integer",虽然我没有测试过,可能你的程序也能run,但这样不好,容易发生ClassCastException

[code:1]<set name="students" table="teacher_student" inverse="true" cascade="save-update" lazy="true"> [/code:1]

当这样设置的时候
如果仅仅是写了session.delete(teacher); 那么delete操作是不可能传播到Student对象的,因为你设置的是cascade="save-update",没有delete操作.
对于一个有着完整性检查的数据库(Mysql除外),这种设置的session.delete(teacher)都会抛出sql异常,原因是有子引用父的时候无法删除父

最好有完整的代码,否则很难分析你的问题
   
0 请登录后投票
时间:2004-09-22
对不起,我贴错了,id全是Integer.
   
0 请登录后投票
时间:2004-09-22
我用的数据库是hsqldb
   
0 请登录后投票
论坛首页 Java版 Hibernate

跳转论坛:
JavaEye推荐