hibernate 某个对象自身多对多 级联删除

时间:2022-11-07 22:08:54

有个类Student,它要自己对自己进行多对多映射

其中Student 类的属性有:

	public int id;
	public String name;
	public String sex;
	private Set<Student> children = new HashSet<Student>();
	private Set<Student> parent = new HashSet<Student>();
省去getter和setter,
一开始hibernate对这个pojo的 多对多配置是:

   <set name="children" table="ss"  cascade="delete“  inverse="false">
            <key column="id"/>
            <many-to-many class="com.shutao.test.model.Student" column="relate_id"/>
     </set>


发现无法实现我要的级联删除:

首先student生成一个表 A

多对多生成的中间表B

B中有两个字段:id 和 relate_id,均作为外键引用A中的主键,同时id和relate_id合起来作为B表的主键。

我要的是当删除A中某条记录的时候,B中也要删除跟这条记录相关的记录,即 B表中那些id或者relate_id为被删除记录的id的记录都要被删掉。

但发现通过这样配置hibernate并不能实现我要的要求,试过几个cascade为save-update,all等都不行,要么提示有约束无法删除,要么连A表中的其他记录也给我删了,晕。

后来直接在数据库进行建表操作,声明外键和级联删除,如:

CREATE TABLE `ss` (
 `id` int(11) NOT NULL,`relate_id` int(11) NOT NULL,PRIMARY KEY (`id`,`relate_id`),
 KEY `FKE60A077974` (`id`),KEY `FKE60990A41A` (`relate_id`),
 CONSTRAINT `FKE60990A41A` FOREIGN KEY (`relate_id`) REFERENCES `s` (`id`)  ON DELETE CASCADE,
 CONSTRAINT `FKE60A077974` FOREIGN KEY (`id`) REFERENCES `s` (`id`) ON DELETE CASCADE );

ss表就是那张用来记录多对多关系的中间表

而配置文件不让它级联了,就这样:

  <set name="children" table="ss"  inverse="false">
            <key column="id"/>
            <many-to-many class="com.shutao.test.model.Student" column="relate_id"/> <!-- 自己对自己-->
     </set>


然后就ok了,不管是在sql语句里直接删除A中的记录还是hibernate中进行删除,都可以成功级联。

其实也挺简单,也记录一下吧。。。