hibernate多表关联删除
?当你完成了多对多的映射,并且在映射文件对应的set(或这list,map)中开启了级联删除(即casecade=delete,大概这样),就可以在测试类中,使用get方法获得对象,在使用set(或者list,map)的对呀删除单个或全部元素的方法,例如list的remove(),removeAt(int index),map的remove( object key),最后在将get的对象使用session.update()方法即可完成级联删除。可以开启控制台打印sql语句,检查是否删除。
hibernate多对多当中,我们常常希望只删除一方已及对应的关系,但不想删除另一方,怎么样达到呢? (这里只提删除) 表user和表role多对多,中间表user_role(userid,roleid),user是主控方,role是从方, 在spring+hibernate的环境下,使用的是annotation配置 user.java @manytomany(cascade = {cascadetype.merge,cascadetype.persist}, fetch = fetchtype.eager) @jointable(name = "user_role", joincolumns = { @joincolumn(name = "userid",referencedcolumnname="userid") }, inversejoincolumns = { @joincolumn(name = "roleid",referencedcolumnname="roleid") }) public set getroles() { return this.roles; } role.java @manytomany(cascade = {cascadetype.merge,cascadetype.persist}, fetch = fetchtype.eager, mappedby = "roles") public set getusers() { return this.users; } 测试:主控方user删除,user会被删除,user_role的中的关系也会被删除了,但对应的role不会被删除 @test public void testdelete() { user user = userdao.findbyid(8); userdao.delete(user); } 测试:从方role删除,如果user_role里面没有对应的roleid,role可以删除,user不会被删除 @test public void testdelete() { role role = roledao.findbyid(26); roledao.delete(role); } 测试:从方role删除,如果user_role里面有对应的roleid和别的userid关联,role不能被删除 @test public void testdelete() { role role = roledao.findbyid(26); roledao.delete(role); } 会报错:org.springframework.dao.dataintegrityviolationexception: could not execute jdbc batch update; nested exception is org.hibernate.exception.constraintviolationexception: could not execute jdbc batch update caused by: org.hibernate.exception.constraintviolationexception: could not execute jdbc batch update caused by: java.sql.batchupdateexception: cannot delete or update a parent row: a foreign key constraint fails (`hrms`.`user_role`, constraint `roleid` foreign key (`roleid`) references `role` (`roleid`) on delete no action on update no action) 解决方案:在数据库里更改user_role表结构,就是添加约束,就添加roleid的删除时进行级联操作 alter table `hrms`.`user_role` add constraint `roleid` foreign key (`roleid` ) references `hrms`.`role` (`roleid` ) on delete cascade; 测试:从方role删除,如果user_role里面有对应的roleid,现在role可以删除,user_role里面对应的关系也会被删除,但对应的user不会被删除,达到我们想要的效果 @test public void testdelete() { role role = roledao.findbyid(26); roledao.delete(role); }