由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- ...
随机推荐
- HTTP基础概念讲解
HTTP基础概念讲解 作者:Danbo 时间:2016-03-17 1.1.http协议头部:curl -I www.meituan.com 1.2.静态和动态 静态网页:纯HTML格式的网页,后台没 ...
- c++ 之重要性
c++的功能比c语言大的多,c语言偏最底层,且程序短小,而对于一个大的系统,用c++,因为它具备了c语言的优点. 很多学嵌入式的觉得学了c语言之后,就不用学c++了,会认为c++很简单,然而,c++并 ...
- c的详细学习(9)结构体与共用体的学习(一)
C语言提供了另外两种构造类型:结构体与公用体,用来存储若干个类型不同但彼此组成一个集合的数据总体. (1)结构体类型与结构体变量 1.定义 其一般形式为: struct 结构体类型名{ 数据类型1 ...
- <Linux内核源码>文件系统VFS内核4.0.4版本基本概念源码
题外话:Linux内核从2.x和3.x到现在最新的4.x变化非常大,最直观的表现就是很多书上的内核代码已经无法直接继续使用,所以看看新的源码是非常有意义的! (下文中的内核源码都来自于 kernel ...
- An Assembly Language
BUFFER OVERFLOW 3 An Assembly Language Introduction Basic of x86 Architecture Assembly Language Comp ...
- mysql 根据sql查询语句导出数据
在这里提供2中方式: 建议:可以使用方式二,就不使用方式一. 方式一: 在linux下支持,window下不支持. 进入到mysql的bin目录,或者已经给mysql配置了环境变量就不用进入bin目录 ...
- 介绍几款Web服务器性能压力测试工具
一.http_load 程序非常小,解压后也不到100K http_load以并行复用的方式运行,用以测试web服务器的吞吐量与负载. 但是它不同于大多数压力测试工具,它可以以一个单一的进程运行,一般 ...
- BZOJ 2431 [HAOI2009]逆序对数列:dp 逆序对
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2431 题意: 给定n,k,问你有多少个由1~n组成的排列,使得逆序对个数恰好为k个. 题解 ...
- HTML5调用百度地图API进行地理定位实例
自从HTML5的标准确定以后,越来越多的网站使用HTML5来进行开发.虽然对HTML5支持的浏览器不是很多,但是依然抵挡不了大伙对HTML5开发的热情.今天为大家带来的是使用HTML5调用百度地图AP ...
- Java8中聚合操作collect、reduce方法详解
Stream的基本概念 Stream和集合的区别: Stream不会自己存储元素.元素储存在底层集合或者根据需要产生.Stream操作符不会改变源对象.相反,它会返回一个持有结果的新的Stream.3 ...