由hibernate配置cascade而导致的软件错误,并分析解决此问题的过程
本文与上一篇文章的软件背景相同,是一个安装部署的工具,这个工具会生成整套系统部署用的xml文件。
这个工具中有一个“克隆”功能,当安装包有新版本后,可以克隆之前的xml版本,并在其基础上做少许修改来适配新版本的功能。
今天遇到的问题就是在克隆阶段。
问题现象:
只有在克隆其中一个产品时会发生如下图所示的错误,其他的产品克隆功能是正常的:
"a different object with the same identifier value was already associated with the session:2, of entity: "

通过上面的错误信息,能够很明确的知道是Hibernate报出的错误。
解决思路:
- 由错误信息能看出,应该是主键冲突,因此首先定位到是由哪条记录导致的主键冲突
- 报错的对象是ValidationType类,ValidationType是数据库初始化创建的数据,无需增删改操作
- 错误日志中没有找到有用的信息。根据调试代码和数据库变化,追踪是哪条记录导致的主键冲突
- 只有一个产品的克隆出现问题,其他的产品都是好的,对比产品的差异,并根据3调试跟踪
根源查找:
- 根据产品xml对比,“克隆”出错的产品,在参数、安装包、验证模块都比其他的多很多
- 根据调试和数据库记录的变化看来,克隆虽然报错,但产品基本信息、安装包等都插入数据库成功,验证模块部分插入成功,所以很可能是验证模块导致的主键冲突
- 检查验证模块的业务,共有8个验证模块,每次都是仅插入了前3条,所以很可能问题出现在第4条和之后
- 发现第4条和第5条的验证模块用了相同的ValidationType,ValidationType是在数据库初始化时插入的,不应该有增删改的操作,查看Hibernate的配置找到问题根源cascade=“save-update”,如下图:

问题分析(cascade=“save-update”):
因为ValidationType是数据库初始化时的数据,不需要增删改,所以应该设置为none模式,如果设置为“save-update”时,hibernate会对他们的ValidationType进行saveorupdate操作,当有两个相同的ValidationType时就出现了主键冲突的错误了。下面是对cascade配置的详细解读
元素的cascade属性表明操作是否从父对象级联到被关联的对象, 它的取得可以是以下几种:
- none:在保存,删除或修改当前对象时,不对其附属对象(关联对象)进行级联操作。它是默认值。
- save-update:在保存,更新当前对象时,级联保存,更新附属对象(临时对象,游离对象)。
- delete:在删除当前对象时,级联删除附属对象。
- all:所有情况下均进行级联操作,即包含save-update和delete操作。
- delete-orphan:删除和当前对象解除关系的附属对象。
更多关于Hibernate中的配置,可以参考链接:https://www.cnblogs.com/little-fly/p/2017-01-05.html
由hibernate配置cascade而导致的软件错误,并分析解决此问题的过程的更多相关文章
- 由hibernate配置inverse="true"而导致的软件错误,并分析解决此问题的过程
题目背景软件是用来做安装部署的工具,在部署一套系统时会有很多安装包,通过此工具,可以生成一个xml文件用以保存每个安装包的文件位置.顺序.参数.所需脚本.依赖条件验证(OS..net.IIS.数据版本 ...
- Jenkins权限配置失误后导致登录失败的解决办法
为了便于管理,Jenkins一般需要设置用户,而且这些用户是需要配置相应的权限的,如果一不小心配置的时候出了问题,那么,你就斯巴达了. 这里,用我的切身经历,为大家说一下Jenkins因为权限配置失误 ...
- Hibernate配置文档详解
Hibernate配置文档有框架总部署文档hibernate.cfg.xml 和映射类的配置文档 ***.hbm.xml hibernate.cfg.xml(文件位置直接放在src源文件夹即可) (在 ...
- Hibernate中cascade作用
Hibernate中cascade作用 只有“关系标记”才有cascade属性: 一个操作因级联cascade可能触发多个关联操作.前一个操作叫“主控操作”,后一个操作叫“关联操作”. cascade ...
- 【转】Hibernate 配置
转自:http://www.blogjava.net/19851985lili/articles/108128.html 由于Hibernate是为了能在各种不同环境下工作而设计的, 因此存在着大量的 ...
- Hibernate配置(外部配置文件方式)
配置Hibernate有2种方式,本文讲的是通过外部配置文件配置的方式 Hibernate核心配置文件 <?xml version='1.0' encoding='UTF-8'?> < ...
- Hibernate配置方式
Hibernate配置方式 Hibernate给人的感受是灵活的,要达到同一个目的,我们可以使用几种不同的办法.就拿Hibernate配置来说,常用的有如下三种方式,任选其一. 在 hibernate ...
- Spring MVC+Spring +Hibernate配置事务,但是事务不起作用
最近做项目,被一个问题烦恼了很久.使用Spring MVC+Spring +Hibernate开发项目,在使用注解配置事务管理,刚开始发现无论如何数据库都无法更新,但是可以从数据库查询到数据.怀疑是配 ...
- Hibernate配置
Ⅰ.Hibernate配置前提工作(E:\): (一).解压4个工具包 工具如下:apache-ant-1.6.2-bin.zip →→ apache-ant- ...
随机推荐
- 牛客小白月赛1 B 简单题2 【数学】
题目链接 https://www.nowcoder.com/acm/contest/85/B 思路 这个 也是 E AC代码 #include <cstdio> #include < ...
- django-forms表单验证
django生成登录随机图片验证码:http://www.cnblogs.com/wupeiqi/articles/4786251.html def insert(request): # print( ...
- matlab之viscircles()函数
函数功能:画圆 语法: viscircles(centers,radii) viscircles(ax,centers,radii) viscircles(___,Name,Value) h = vi ...
- BZOJ 1059 [ZJOI2007]矩阵游戏:二分图匹配
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1059 题意: 给你一个n*n的01矩阵. 你可以任意次地交换某两行或某两列. 问你是否可以 ...
- pom详解
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...
- jmeter 多压力机并发测试过程
要实现多台压力机并发,就必须有多台服务器上安装了jmeter程序包,首先把一台服务器作为主压力机,测试脚本放到这台机器上,主压力机与从压力机在同一局域网中,服务器之间可以ping通 第一步:在linu ...
- kylin_学习_01_kylin安装部署
一.环境准备 根据官方文档,kylin是需要运行在hadoop环境下的,如下图: 1.hadoop环境搭建 参考:hadoop_学习_02_Hadoop环境搭建(单机) 2.hbase环境搭建 参考: ...
- 时间复杂度O(n)与空间复杂度O(1)
把输入规模看成x轴,所花时间/空间看成y轴.O(n)就是 y = x, y随x的增长而线性增长.一条斜线O(1)就是 y = 1,不管x如何变,y不变.一条与x平行的线 举个简单的例子,要从0加到n, ...
- C++ STL源码剖析
stl_config.h defalloc.h stl_alloc.h memory.cpp stl_construct.h stl_uninitialized.h stl_iterator.h ty ...
- 属性成员是isXxx时对应的get方式是isXxx,前台jsp取不到这个属性值
最近在项目中无意设置的boolean变量值为isXxx,用eclipse生成相应的set和get方法,eclipse生成的的boolean类型的get方法为isXxx,前台导致取不到相应的值 publ ...