有个类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中进行删除,都可以成功级联。
其实也挺简单,也记录一下吧。。。