本文与上一篇文章的软件背景相同,是一个安装部署的工具,这个工具会生成整套系统部署用的xml文件。

这个工具中有一个“克隆”功能,当安装包有新版本后,可以克隆之前的xml版本,并在其基础上做少许修改来适配新版本的功能。

今天遇到的问题就是在克隆阶段。

问题现象:

只有在克隆其中一个产品时会发生如下图所示的错误,其他的产品克隆功能是正常的:

"a different object with the same identifier value was already associated with the session:2, of entity: "

通过上面的错误信息,能够很明确的知道是Hibernate报出的错误。

解决思路:

  1. 由错误信息能看出,应该是主键冲突,因此首先定位到是由哪条记录导致的主键冲突
  2. 报错的对象是ValidationType类,ValidationType是数据库初始化创建的数据,无需增删改操作
  3. 错误日志中没有找到有用的信息。根据调试代码和数据库变化,追踪是哪条记录导致的主键冲突
  4. 只有一个产品的克隆出现问题,其他的产品都是好的,对比产品的差异,并根据3调试跟踪

根源查找:

  1. 根据产品xml对比,“克隆”出错的产品,在参数、安装包、验证模块都比其他的多很多
  2. 根据调试和数据库记录的变化看来,克隆虽然报错,但产品基本信息、安装包等都插入数据库成功,验证模块部分插入成功,所以很可能是验证模块导致的主键冲突
  3. 检查验证模块的业务,共有8个验证模块,每次都是仅插入了前3条,所以很可能问题出现在第4条和之后
  4. 发现第4条和第5条的验证模块用了相同的ValidationType,ValidationType是在数据库初始化时插入的,不应该有增删改的操作,查看Hibernate的配置找到问题根源cascade=“save-update”,如下图:

问题分析(cascade=“save-update”):

  因为ValidationType是数据库初始化时的数据,不需要增删改,所以应该设置为none模式,如果设置为“save-update”时,hibernate会对他们的ValidationType进行saveorupdate操作,当有两个相同的ValidationType时就出现了主键冲突的错误了。下面是对cascade配置的详细解读

元素的cascade属性表明操作是否从父对象级联到被关联的对象, 它的取得可以是以下几种:

  1. none:在保存,删除或修改当前对象时,不对其附属对象(关联对象)进行级联操作。它是默认值。
  2. save-update:在保存,更新当前对象时,级联保存,更新附属对象(临时对象,游离对象)。
  3. delete:在删除当前对象时,级联删除附属对象。
  4. all:所有情况下均进行级联操作,即包含save-update和delete操作。
  5. delete-orphan:删除和当前对象解除关系的附属对象。

更多关于Hibernate中的配置,可以参考链接:https://www.cnblogs.com/little-fly/p/2017-01-05.html

由hibernate配置cascade而导致的软件错误,并分析解决此问题的过程的更多相关文章

  1. 由hibernate配置inverse="true"而导致的软件错误,并分析解决此问题的过程

    题目背景软件是用来做安装部署的工具,在部署一套系统时会有很多安装包,通过此工具,可以生成一个xml文件用以保存每个安装包的文件位置.顺序.参数.所需脚本.依赖条件验证(OS..net.IIS.数据版本 ...

  2. Jenkins权限配置失误后导致登录失败的解决办法

    为了便于管理,Jenkins一般需要设置用户,而且这些用户是需要配置相应的权限的,如果一不小心配置的时候出了问题,那么,你就斯巴达了. 这里,用我的切身经历,为大家说一下Jenkins因为权限配置失误 ...

  3. Hibernate配置文档详解

    Hibernate配置文档有框架总部署文档hibernate.cfg.xml 和映射类的配置文档 ***.hbm.xml hibernate.cfg.xml(文件位置直接放在src源文件夹即可) (在 ...

  4. Hibernate中cascade作用

    Hibernate中cascade作用 只有“关系标记”才有cascade属性: 一个操作因级联cascade可能触发多个关联操作.前一个操作叫“主控操作”,后一个操作叫“关联操作”. cascade ...

  5. 【转】Hibernate 配置

    转自:http://www.blogjava.net/19851985lili/articles/108128.html 由于Hibernate是为了能在各种不同环境下工作而设计的, 因此存在着大量的 ...

  6. Hibernate配置(外部配置文件方式)

    配置Hibernate有2种方式,本文讲的是通过外部配置文件配置的方式 Hibernate核心配置文件 <?xml version='1.0' encoding='UTF-8'?> < ...

  7. Hibernate配置方式

    Hibernate配置方式 Hibernate给人的感受是灵活的,要达到同一个目的,我们可以使用几种不同的办法.就拿Hibernate配置来说,常用的有如下三种方式,任选其一. 在 hibernate ...

  8. Spring MVC+Spring +Hibernate配置事务,但是事务不起作用

    最近做项目,被一个问题烦恼了很久.使用Spring MVC+Spring +Hibernate开发项目,在使用注解配置事务管理,刚开始发现无论如何数据库都无法更新,但是可以从数据库查询到数据.怀疑是配 ...

  9. Hibernate配置

    Ⅰ.Hibernate配置前提工作(E:\):    (一).解压4个工具包         工具如下:apache-ant-1.6.2-bin.zip      →→     apache-ant- ...

随机推荐

  1. iOS 图文混排 链接 可点击

    对于这个话题 我想到 1 第一个解决方法就是使用 webView 比较经典 把所有复杂工作都交给控件本身去处理了,  但是好像好多需要自定义的地方 没法从 webView获得响应回调 :(估计也可以实 ...

  2. Android开发--多线程之Handler

    前言 Android的消息传递机制是另外一种形式的“事件处理”,这种机制主要是为了解决Android应用中多线程的问题,在Android中不 允许Activity新启动的线程访问该Activity里的 ...

  3. c的详细学习(4)选择结构与循环结构的编程练习

        本节介绍c语言的编程实例.     (1)求方程ax^2+bx+0的解: 方程有解有以下几种可能: 1.b^2-4ac=0,方程有两个相等实根. 2.b^2-4ac>0,方程有两个不等实 ...

  4. HDFS常见问题

    在HDFS里面,data node上的块大小默认是64MB(或者是128MB或256MB) 问题: 为什么64MB(或128MB或256MB)是最优选择? 为什么不能远少于64MB(或128MB或25 ...

  5. ELK初步指南

    ELK的简单科普文章,加入了自己的一些理解. 内容包括ELK的基本介绍, 应用场景, 架构设计, 监控及自监控, 业界进展及推荐资料等. 用户故事 场景一 作为一个运维工程师, 某天虚拟机出现故障, ...

  6. castle windsor学习-----XML Inline Parameters 内联参数

    当使用XML配置的时候,可能要给组件指定各种各样的依赖 1.简单的参数 参数名称不区分大小写 <component id="ping" type="Acme.Crm ...

  7. Java -- 封装访问控制级别,包, instanceof 运算符, 初始化块

    1. 可以用 package name1.name2; 显式的定义包名, *.class文件位置应该对应包 name1 name2 的目录下. 2. instanceof 运算符 Object obj ...

  8. Python快速学习-基础语法

  9. form表单验证失败,阻止表单提交

    form表单验证失败,阻止表单提交 效果演示: 贴上完整代码: <!DOCTYPE html> <html lang="en"> <head> ...

  10. 创建 CSS3 下拉菜单

    1. [图片] 菜单效果 2. [代码]menu.html <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" ...