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


    题目背景软件是用来做安装部署的工具,在部署一套系统时会有很多安装包,通过此工具,可以生成一个xml文件用以保存每个安装包的文件位置、顺序、参数、所需脚本、依赖条件验证(OS、.net、IIS、数据版本等),有了这个定义好的xml就可以轻而易举的安装非常多的安装包(有一个专门解析此xml的软件来操作)。

    今天要介绍的问题发生在生成xml过程中,当生成xml时,对验证模块的内容(OS、.net、IIS、数据版本等)添加失败,纠其原因是inverse="true"的配置导致的。下面详细讲解问题的发生时的现象,和解决这个问题的过程,来梳理下当遇到此类问题时应当如何下手。

    数据管理是用的Hibernate,通过简单的配置来代替复杂的SQL语句。

    问题现象:

    1. 添加完Validation(下文将用Validation代替依赖条件验证)信息后,点击保存按钮,显示保存成功,并且Validation的信息也保存到数据库,但是与Validation关联的父对象字段为NULL,失去了关联关系,导致界面显示不出所添加的Validation来,如下图(1-1):
    2. 关联的父id为NULL:(图1-2)
    3. 关联的父id创建成功:(图1-3)
    4. 管之前版本的validation.dll文件是能够保存Validation信息的,最新版本的validation.dll不能保存Validation信息

    解决思路:

    1. 查看日志并无异常?没有异常,排除代码走到了catch里,一切看似友好
    2. 到数据库中查询数据是否保存到库中?确实保存到数据库中,但缺少关联关系,导致一直Validation与父记录关联不起来,看似没有保存成功。所以基本定位到是在往数据库存储时的顺序问题,因为必须是先有父记录,才能写子记录并把父记录Id保存到子记录的关联中。很可能是Hibernate配置中出现问题
    3. 因为之前的dll是能保存成功,最新的不能保存成功,所以考虑对比两个dll的差异,寻找问题的根源。最终查找并定位到问题

    根源查找(对比dll):

      对比两个版本的dll是非常困难的事情,因为命名空间和代码众多。如果只是用反编译工具一行一行的对比的话就太费时间和精力了。所以对比dll也是需要方法的,这里就用了两个非常有用的工具,ILSpy和WinMerge。ILSpy和WinMerge都是免费的,大家可以到百度一搜网上下载,这里就不提供链接了。

    • ILSpy负责反编译dll代码,并把代码保存成文件目录的状态
    • WinMerge负责对比两个文件夹内容的不同

      好的,下面开始讲如何操作

    1. 用ILSpy打开老版本validation.dll,我们称之为validation_old.dll:File->Open->找到dll
    2. 把validation_old.dll保存成文件目录的状态:选中validation_old.dll节点->File->Save Code...,保存到文件夹validation_old。图(3-1)
    3. 重复上面123的步骤,把新版本validation_new.dll保存到文件夹:validation_old

    4. 用WinMerge工具,对比两个文件夹,依次查看每个文件的变化,最终定位到Hibernate配置文件中问题的根源:inverse=“true”
    5. 图(3-2)

    问题分析(inverse=“true”):

      inverse关键字表示“是否放弃维护关联关系”,默认是false。true放弃维护关联关系。

      这里的问题根源就是把inverse=“true”设在了Validations里(如上图右侧错误的配置),导致他们的关联关系没有保存到数据库中。

      当去掉inverse=“true”后,就会变成如上图1-1中间记录一样,恢复正常

      具体可参考这篇文章:

    1. https://www.cnblogs.com/little-fly/p/2017-01-05.html
    2. https://www.mkyong.com/hibernate/inverse-true-example-and-explanation/

    总结:

    1. DLL对比可以使用ILSpy解压后,再通过WinMerge对比
    2. WinMerge可以对比文件夹的异同,不只用在这里
    3. Hibernate中的配置使用要理解透彻,不然很容易掉进坑里
  • 相关阅读:
    matlab的矩阵基础
    matlab基础运算
    【转】Android设置虚线、圆角、渐变
    DialogFragment 自定义弹窗
    imeOptions 属性详解
    android fragment 博客 学习记录
    【转】android fragment 博客 学习
    android UI库
    【转】 Android自定义捕获Application全局异常
    vitamio 缓冲一部分时,loading还没消失,直接点击播放,loading未能消失
  • 原文地址:https://www.cnblogs.com/zhengshuangliang/p/9540995.html
Copyright © 2020-2023  润新知