本文与上一篇文章的软件背景相同,是一个安装部署的工具,这个工具会生成整套系统部署用的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. HackerRank - camelcase 【字符串】

    思路 找单词 第一个 单词 是小写 然后 后面的单词 第一位 都是大写 刚开始 初始化 ans = 1 然后 往后遍历 碰到 大写的 更新答案 AC代码 #include <cstdio> ...

  2. LintCode:链表操作(合并与反转)

    描述: (1)翻转一个链表 样例 给出一个链表1->2->3->null,这个翻转后的链表为3->2->1->null ********************** ...

  3. [原创]Scala学习:Tuple,Array,Map ,文件操作

    1.Tuple:元祖.是一个有用的容器对象. 1)特点:  ① 元祖是不可变的,即,当声明完了一个元祖,那么它的长度就不可以在改变:  ② 元祖可以包含不同类型的数据,对象:   ③ 索引是从 '_1 ...

  4. mini2440移植uboot 2011.03(上)

    参考博文: <u-boot-2011.03在mini2440/micro2440上的移植> 本来我想移植最新版的uboot,但是移植却不太成功,所以先模仿他人的例子重新执行一遍,对uboo ...

  5. 用Delphi模拟键盘输入

    在Windows大行其道的今天,windows界面程序受到广大用户的欢迎.对这些程序的操作不外乎两种,键盘输入控制和鼠标输入控制.有时,对于繁杂的,或重复性的操作,我们能否通过编制程序来代替手工输入, ...

  6. EntityFramework 学习 一 Eager Loading

    贪婪加载是指查询一个类型实体的时候同时查询与实体关联的类型 通过Include()方法实现 using (var context = new SchoolDBEntities()) { var stu ...

  7. App开发流程之iOS开发证书拾遗

    很久没有总结,回头看了一下过期的账号,记录的内容少之又少.最近有一些时间,想好好总结记录一下. 由于很久没有记录,想写的东西很多又很杂,想了一下,一篇一篇罗列知识点和经验,还不如写一个系列,记录一个应 ...

  8. Qt之任务栏系统托盘图标

    转自  --> http://blog.csdn.net/qivan/article/details/7506306 托盘图标,一个自己脑子出现很久的词,可惜自己都没动手去实现.最近看见的,听见 ...

  9. Angular-ui-router路由,View管理

    ui-router的工作原理非常类似于Angular的路由控制,他只关注状态. Angular模板 最简单的模板,例如main.html: <body data-ng-app="myA ...

  10. java事务(一)——事务特性

    事务 什么是事务?事务通俗的讲就是要做的事,在计算机术语中一般指访问或更新数据库中数据的一个工作单元.说起事务,那么就要提到事务的ACID特性,即原子性(atomicity).一致性(consiste ...