有用户和用户组两个表,需要使用hibernate做级联删除。映射文件如下:

Groups.hbm.xml

<class name="com.cms.entity.Groups" table="groups" catalog="cms"><id name="id" type="java.lang.Integer"><column name="id" /><generator class="native"></generator></id><property name="name" type="java.lang.String"><column name="name" length="100" not-null="true" /></property><property name="description" type="java.lang.String"><column name="description" length="500" /></property><property name="authority" type="java.lang.String"><column name="authority" length="200" /></property><set name="users" inverse="true" lazy="false" cascade="all-delete-orphan"><key><column name="group_id" not-null="true" /></key><one-to-many class="com.cms.entity.User" /></set>
</class>

User.hbm.xml

<hibernate-mapping><class name="com.cms.entity.User" table="user" catalog="cms"><id name="id" type="java.lang.Integer"><column name="id" /><generator class="native"></generator></id><many-to-one name="groups" class="com.cms.entity.Groups" fetch="select"><column name="group_id" not-null="true" /></many-to-one><property name="name" type="java.lang.String"><column name="name" length="50" not-null="true" /></property><property name="password" type="java.lang.String"><column name="password" length="200" not-null="true" /></property><property name="qq" type="java.lang.String"><column name="qq" length="50" /></property><property name="phone" type="java.lang.String"><column name="phone" length="50" /></property><property name="postDate" type="java.util.Date"><column name="post_date" length="0" not-null="true" /></property><set name="articles" inverse="true" cascade="all-delete-orphan"><key><column name="user_id" not-null="true" /></key><one-to-many class="com.cms.entity.Article" /></set></class>
</hibernate-mapping>

原本要做的是,删除用户组时将其下所属的用户全部删除;删除用户时,不对用户组进行更改。

结果过执行报错:deleted object would be re-saved by cascade (removedeleted object from associations)

感觉可能是cascade的配置问题,修改了下发现还是报错。后来我将Groups映射文件中<set>元素的lazy属性设置为true。删除成功!但是这样由于是延迟加载,就没法在页面中通过groups来获取User集合中的对象了(本来是想统计用户组中用户成员的个数)。于是还得修改。

查了文档弄明白了怎么回事。

原来cascade属性在lazy=true的时候不起作用(集合中对象还没初始化)。所以在删除User的时候,就不会触发对关联关系的维护。

而当lazy=false的时候,由于我们设置了cascade,那么删除User的时候会触发关系维护,此时虽然在user中已经将对应的Groups属性设置为null(删除前会先将外键设置为null)。但是由于Groups中的Set中仍然还保持着我们删除的User对象,所以触发关系维护的时候,这个User对象又会被重新保存到数据库中。造成了前面出现的异常。

当然,如果我们删除Groups的时候,如果没有将Set的cascade设置为all或delete,那么就会报错: Cannot delete or update a parent row:a foreign key constraint fails,因为groups删除了,User中对groups的外键引用怎么办?

解决的办法就是,如果不需要在groups中直接获取Set中的User对象,那么就把lazy设置为true就可以了。不设置cascade也可以,不过删除groups的时候就可能有问题了。或者通过代码,在删除之前将关联关系解除。

public void delete(User entity) {

entity.getGroups().getUsers().remove(entity);

entity.setGroups(null);

userDao.delete(entity);

}

hibernate级联删除问题相关推荐

  1. Hibernate级联删除提示约束失败DELETE 语句与 REFERENCE 约束FK_SelectCourse_StudentInfo冲突。...

    前台执行删除带约束关系的时候,后台提示错误 Hibernate: delete from Student.dbo.StudentInfo where Snu=? 删除失败! org.hibernate ...

  2. hibernate 级联删除

    配置文件和pojo类如下: Xml代码  <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE h ...

  3. [JAVAWEB实战篇]---Hibernate实现级联删除

    Hibernate实现级联删除 版权所有,转载请注明出处zhyiwww@163.com 我的使用背景: v有新闻和新闻类型,一条新闻只能属于一个类型,一种新闻类型可以对应多条新闻. v在数据库中,新闻 ...

  4. Hibernate级联操作 注解

    EJB3 支持的操作类型 /*** Cascade types (can override default EJB3 cascades*/ public enum CascadeType {ALL,P ...

  5. hibernate级联操作详解

    2019独角兽企业重金招聘Python工程师标准>>> 级联操作 一.简单的介绍 cascade和inverse (Employee – Department) l Casade用来 ...

  6. jpa和hibernate_JPA和Hibernate级联类型的初学者指南

    jpa和hibernate 介绍 JPA将实体状态转换转换为数据库DML语句. 由于对实体图进行操作很常见,因此JPA允许我们将实体状态更改从父级传播到子级 . 通过CascadeType映射配置此行 ...

  7. JPA和Hibernate级联类型的初学者指南

    介绍 JPA将实体状态转换转换为数据库DML语句. 由于对实体图进行操作很常见,因此JPA允许我们将实体状态更改从父级传播到子级 . 通过CascadeType映射配置此行为. JPA与Hiberna ...

  8. java 级联删除_级联删除 - Asher鑫与 - 博客园

    相信学过数据库基础的童鞋们都知道,当有两个表A和B,表A的外键正是表B的主键时,我们会发现,当我们用数据库语言对B表数据进行删除操作的时候,我们会发现根本就删除不了,所以呢,在实际代码中,想要通过点击 ...

  9. java 级联删除_Hibernate实现级联删除

    我的使用背景: v 有新闻和新闻类型,一条新闻只能属于一个类型,一种新闻类型可以对应多条新闻. v 在数据库中,新闻受新闻类型外键约束,并可以级联删除 v 在 Hibernate 中,实现级联删除 v ...

最新文章

  1. 为什么品牌商纷纷搭建自己的商城小程序?
  2. 趋势|40个统计数据展示CPaaS的2021现状
  3. leetcode739. 每日温度
  4. 2019计算机组成原理及答案,2019计算机组成原理复习题(一)
  5. Redis入门之二6379端口
  6. Guava的介绍与使用示例
  7. ELK下logstash收集java日志,多行合并成一行
  8. 前端常用的JavaScript 库和框架(一)
  9. 第10章 主成分分析(PCA)
  10. Vue2 - 网易云音乐项目笔记(基于Vant UI组件库)
  11. Java面试自我介绍篇
  12. 关于Unity中的NGUI优化,你可能遇到这些问题
  13. 3GPP TS 23501-g51 中英文对照 | 5.2.5 Access control and barring
  14. 进程和程序区别和联系
  15. 小程序短视频项目———视频展示页面开发
  16. 如何更高效、系统地学习3D视觉?
  17. 留学生把“中国牛排”臭豆腐带到国外,18家连锁店开遍澳洲
  18. 敏捷开发绩效管理系列之八:阿米巴经营之序言
  19. 89c52流水灯c语言程序,【学习之路】STC89C52RC流水灯程序
  20. 工商局爬虫 商标网爬虫

热门文章

  1. 白帽黑客眼中的网络安全 挡黑客财路曾收恐吓信
  2. 回溯法——求解N皇后问题
  3. Spring强制使用CGLIB代理事务
  4. Springboot 应用部署建议
  5. 架构师速成8.3-可用性之分库分表
  6. jquery-easyui中表格的行编辑功能
  7. WINDOWS假冒KERBEROS令牌***域
  8. Proxmox VE2.2虚拟化安装配置学习笔记(三)
  9. BSCI—7:OSPF的路由汇总
  10. 使用webpack.require优化vue项目的路由