• 由hibernate配置cascade而导致的软件错误,并分析解决此问题的过程


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

  • 相关阅读:
    Eclipse代码快捷键
    QuickBI助你成为分析师——计算字段功能
    怎么从Linux服务器上下载超过4G的文件?
    centOS7下Spark安装配置
    s3c2440裸机-清bss原理及实现
    s3c2440裸机-代码重定位(2.编程实现代码重定位)
    Markdown语法教程
    s3c2440裸机-代码重定位(1.重定位的引入,为什么要代码重定位)
    s3c2440裸机-内存控制器(五、SDRAM编程实现)
    s3c2440裸机-内存控制器(四、SDRAM原理-cpu是如何访问sdram的)
  • 原文地址:https://www.cnblogs.com/zhengshuangliang/p/9542344.html
Copyright © 2020-2023  润新知