在使用hibernate+spring做级联删除的时候,有时候我们会遇到这个异常:
deleted object would be re-saved by cascade (remove deleted object from associations)
比如说,论坛模块中,一个帖子对应多个一级评论,每个一级评论又对应多个二级评论。
这个时候,帖子和一级评论 是双向一对多,一级评论和二级评论是双向的一对多关系。
我们在设置表关系的时候,一般是把一对多的一端的set设置inverse="true" cascade="all" 这两个属性。也就是说,控制权交给了多的一端,然后级联操作是所有操作都级联。
此时当我们要删除 一级评论 的时候,就可能出现这个异常。
因为,一级评论既是帖子的多端,也是二级评论的一端。按照道理,应该只是把一级评论及其对应的二级评论的记录都删除就对了。而且我们设置的也完全合理。但是还是会出现这个异常。
我们在使用spring+hibernate的时候,一般是使用spring来管理事务,如果我们直接使用hibernate来进行删除操作,并且事务都是手动开启手动提交的,这时有可能就不会出现这个异常了。但是,既然使用了spring,不用spring的事务就有点浪费了。
Session session=this.getHibernateTemplate().getSessionFactory().openSession(); session.beginTransaction(); session.delete(topicFirstDis); session.getTransaction().commit(); session.close();
具体解决办法:
方法一:(已测试,可用)
在调用删除方法的前面加this.getHibernateTemplate().clear();来清理缓存。有可能的原因是因为这个session查询到的这个 一级评论 是某一个已经查询出来的 帖子 的子记录。所以会提示我们 从级联中移除这个要删除的对象。
代码如下:
this.getHibernateTemplate().clear(); this.getHibernateTemplate().delete(topicFirstDis);
这样有可能就可以进行删除了。
方法二:(已测试,可用)
把这个一级评论和帖子的关联关系去掉后,再进行删除操作
topic.getTopicFirstDisSet().remove(topicFirstDis); topicFirstDis.setTopic(null); boolean result=topicDao.deleteFirstDiscuss(topicFirstDis);
在帖子的set集合中把这个 要删除的一级评论remove出去,同时把 该一级评论的父对象属性设为null。然后再调用这个 一级评论的删除方法。
方法三:(已测试,可用)
在直接使用hibernate操作的时候,也可能出现这个异常,这个时候,我们也需要按照上面的方法二的方式把 帖子对象中的要删除的一级评论先remove出去,然后再把这个一级评论的父对象的属性设为null,就可以了。
当然也可以试试下面的代码,原理其实都是一样的。
Session session=this.getHibernateTemplate().getSessionFactory().openSession(); session.beginTransaction(); //把一级评论从帖子中移除 Topic topic=(Topic) session.load(Topic.class, topicFirstDis.getTopic().getTopicid()); topic.getTopicFirstDisSet().remove(topicFirstDis); session.delete(topicFirstDis); session.getTransaction().commit(); session.close();
方法四:(未测试,摘自网络)
删除Set方的cascade:(缺点:子对象和父对象不能进行级联更新,没意义)
方法五:(未测试,摘自网络)
在many-to-one方增加cascade 但值不能是none (缺点:子对象也级联到父对象,难得删除一个学生要把老师也删除?)
方法六:(未测试,摘自网络)
直接把子对象关联的父对象setNull,然后保存子对象,然后删除子对象,具体看代码
Java代码
thisMany.setOne(null); Service.update(thisMany); Service.delete(thisMany);
参考文章:
http://www.blogjava.net/crazycy/archive/2006/06/24/54939.html
http://blog.csdn.net/zhujiaxing666666/article/details/8499103
http://hi.baidu.com/wo940080073/item/b5c5508742eaaad0d1f8cd23
相关推荐
DWR+hibernate+spring级联下拉列表框 DWR+hibernate+spring级联下拉列表框
struts+hibernate+ajax级联菜单struts+hibernate+ajax级联菜单
使用struts2、hibernate、spring、dwr整合的简单项目。包括级联等 注意:csdn上面显示为chm文件。该文件为.7z的压缩文件。用压缩软件可以打开的 csdn弄错了
inverse Hibernate_级联关系说明_-_关于cascade和inverse的用法
hibernate many-to-many级联保存,级联更新,级联删除
---------------------------...2.内容:RS+BCH级联编译码误码率性能matlab仿真+简要说明文档+程序操作视频 3.用处:用于RS+BCH级联编译码算法编程学习 4.指向人群:本硕博等学习教研使用,企事业简单项目方案验证参考
uniapp选择器,包含一级,二级级联,三级级联uniapp-picker-master.zip
Hibernate cascade (级联).docHibernate_cascade(级联).doc
Ajax+struts+hibernate实现级联菜单 Ajax+struts+hibernate实现级联菜单 Ajax+struts+hibernate实现级联菜单
jsp + servlet 级联菜单 简单适用,非常适合新手!
好好看看!这是关于jQuery + Ajax + json 级联的一段代码!
网络电子教案7-1+交换机级联.pdf
网络电子教案7-1+交换机级联.doc
用Struts2+Spring+Hibernate三大框架完成的级联操作,包括省市县和年月日
uniapp选择器,包含一级,二级级联,三级级联uniapp-picker-master(小程序)
Hibernate的级联操作(增,删,该)
基于eclipse开发的Struts+hibernate+SqlServer2000级联下拉框
做项目时整理的,上传给大家分享一下,数据库自己建吧就不上传了,应该都能看明白
Spring+Struts+Hibernate+Jquery(AJAX)实现的省份与城市级联效果 原理:通过ajax调用后端struts的action,将返回的JSON对象数组解析载入页面。
这是一个ajax+jQuery+ssh+oracle的myeclipse级联实例,可以直接导入工具后运行。