`
ykyfendou
  • 浏览: 406720 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

hibernate+spring级联删除异常deleted object would be re-saved by cascade (remove delete

阅读更多

 

在使用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 结合使用可以方便地实现级联下拉列表框,提供流畅的用户体验。通过 DWR 实现前后端的实时通信,利用 Hibernate 进行数据操作,借助 Spring 管理业务逻辑和数据访问,从而构建出高效...

    struts+hibernate+ajax级联菜单

    Struts、Hibernate和Ajax是Java Web开发中的三大核心技术,它们分别负责不同的职责,共同构建出高效、动态的Web应用程序。本项目"struts+hibernate+ajax级联菜单"结合了这三者,旨在实现一种交互性更强的前端菜单...

    struts2+hibernate+spring+dwr整合

    Struts2、Hibernate、Spring 和 DWR 是四个在Java Web开发中非常重要的框架,它们各自在不同的领域提供了强大的功能,并且能够通过整合实现更高效、更灵活的应用开发。接下来,我们将详细探讨这些技术以及它们如何...

    hibernate many-to-many级联保存,级联更新,级联删除

    当调用`session.delete(student)`或`session.delete(course)`时,如果配置了级联删除,Hibernate会检查关联表,找出所有与被删除实体关联的记录,并一并删除。请注意,级联删除可能引起数据丢失,因此在使用时需谨慎...

    毕业设计struts+hibernate+spring添删改查示例源码

    在这个"毕业设计struts+hibernate+spring添删改查示例源码"中,我们可以期待看到如何将这三个框架结合使用,完成对数据的添加(Add)、删除(Delete)、修改(Update)和查询(Query)操作。通常,这会涉及以下步骤...

    Hibernate_级联关系说明_-_关于cascade和inverse的用法

    在探讨Hibernate框架中的级联操作(cascade)与控制权反转(inverse)之前,我们需要先对Hibernate有一个基本的理解。Hibernate是一个开放源代码的对象关系映射(ORM)框架,它为Java应用提供了一种将对象模型映射到...

    Hibernate 删除出现异常的解决方案.doc

    在使用Hibernate进行数据库操作时,有时会遇到一种异常情况,即在尝试删除一个对象时,系统抛出"deleted object would be re-saved by cascade (remove deleted object from associations)"的异常。这个异常通常发生...

    struts2+hibernate+spring多表操作示例

    Struts2、Hibernate和Spring是Java Web开发中的三大框架,它们各自负责应用程序的不同层面:Struts2处理MVC(Model-View-Controller)架构中的控制层,Hibernate专注于对象关系映射(ORM)以简化数据库交互,而...

    Hibernate cascade (级联).doc

    ### Hibernate级联(Cascade)详解 #### 一、概述 Hibernate 是一款强大的对象关系映射 (ORM) 框架,它允许开发人员将 Java 对象模型映射到数据库表,从而极大地简化了数据访问层的开发工作。在 Hibernate 中,...

    RS+BCH级联编译码误码率性能matlab仿真+简要说明文档+程序操作视频

    ---------------------------...2.内容:RS+BCH级联编译码误码率性能matlab仿真+简要说明文档+程序操作视频 3.用处:用于RS+BCH级联编译码算法编程学习 4.指向人群:本硕博等学习教研使用,企事业简单项目方案验证参考

    Struts 2+Hibernate+Spring整合开发技术详解 6~11章

    Struts 2、Hibernate 和 Spring 是Java Web开发中的三大核心框架,它们的整合使用能够构建出高效、松耦合的企业级应用。这本书《Struts 2+Hibernate+Spring整合开发技术详解》由蒲子明撰写,由清华大学出版社出版,...

    论坛系统(Struts 2+Hibernate+Spring实现)

    【标题】"论坛系统(Struts 2+Hibernate+Spring实现)" 描述了一个使用了经典Java技术栈构建的Web应用程序。这个系统充分利用了Struts 2、Hibernate和Spring这三大框架的优势,来构建一个高效、灵活且易于维护的论坛...

    Ajax+struts+hibernate实现级联菜单

    Ajax+struts+hibernate实现级联菜单 Ajax+struts+hibernate实现级联菜单 Ajax+struts+hibernate实现级联菜单

    uniapp选择器,包含一级,二级级联,三级级联uniapp-picker-master.zip

    在"uniapp选择器,包含一级,二级级联,三级级联uniapp-picker-master.zip"这个压缩包中,包含了实现这种级联选择的示例代码。 uni-app是一个多端统一的开发框架,它可以将同一份代码编译到iOS、Android、H5、小程序等...

    Hibernate的级联操作(增,删,该)

    2. 级联删除(Cascade Type.REMOVE) 当设置为`CascadeType.REMOVE`时,如果删除了父实体,与之关联的子实体也会被删除。这在处理一对多或者多对多关系时非常有用,可以确保相关的数据在数据库中得到一致性的清理。...

    ajax+jQuery+ssh+oracle级联实例

    在IT行业中,构建高效、动态的Web应用是关键任务之一,而"ajax+jQuery+ssh+oracle级联实例"提供了一个具体的实现方案。这个实例涵盖了前端到后端的关键技术,包括异步数据交互(Ajax)、JavaScript库(jQuery)、...

    PyPI 官网下载 | django-postgres-delete-cascade-2.0a1.tar.gz

    总的来说,“django-postgres-delete-cascade”库可能是为了解决Django与PostgreSQL交互时,关于级联删除操作的自动化和便捷性问题,使得开发者能够更轻松地管理数据库中的关联数据。对于使用Django框架并且依赖...

    struts2+hibernate+spring的几篇入门用网文

    Struts2、Hibernate和Spring是Java开发中三大重要的框架,它们各自解决不同的问题,并通过集成提供了一种强大的企业级应用开发解决方案。这篇文章将详细介绍这三个框架的基本概念、功能以及它们如何协同工作。 首先...

    php+juqery+mysql级联列表

    在IT行业中,级联列表(Cascading Dropdown List)是一种常见的交互设计,它通常用于多级选择场景,比如地区选择、分类导航等。这个“php+jquery+mysql级联列表”项目是关于如何使用这三种技术来实现这样一个功能的...

    Hibernate+Struts2+Spring基本JAR包

    SSH(Struts2、Spring、Hibernate)是Java Web开发中常用的一种开源框架组合,它能够帮助开发者快速构建高效、可维护的Web应用。这组框架的整合提供了模型-视图-控制器(MVC)架构模式,实现了业务逻辑层、数据访问...

Global site tag (gtag.js) - Google Analytics