由hibernate配置inverse="true"而导致的软件错误,并分析解决此问题的过程
题目背景软件是用来做安装部署的工具,在部署一套系统时会有很多安装包,通过此工具,可以生成一个xml文件用以保存每个安装包的文件位置、顺序、参数、所需脚本、依赖条件验证(OS、.net、IIS、数据版本等),有了这个定义好的xml就可以轻而易举的安装非常多的安装包(有一个专门解析此xml的软件来操作)。
今天要介绍的问题发生在生成xml过程中,当生成xml时,对验证模块的内容(OS、.net、IIS、数据版本等)添加失败,纠其原因是inverse="true"的配置导致的。下面详细讲解问题的发生时的现象,和解决这个问题的过程,来梳理下当遇到此类问题时应当如何下手。
数据管理是用的Hibernate,通过简单的配置来代替复杂的SQL语句。
问题现象:
- 添加完Validation(下文将用Validation代替依赖条件验证)信息后,点击保存按钮,显示保存成功,并且Validation的信息也保存到数据库,但是与Validation关联的父对象字段为NULL,失去了关联关系,导致界面显示不出所添加的Validation来,如下图(1-1):
- 关联的父id为NULL:(图1-2)
- 关联的父id创建成功:(图1-3)
- 管之前版本的validation.dll文件是能够保存Validation信息的,最新版本的validation.dll不能保存Validation信息
解决思路:
- 查看日志并无异常?没有异常,排除代码走到了catch里,一切看似友好
- 到数据库中查询数据是否保存到库中?确实保存到数据库中,但缺少关联关系,导致一直Validation与父记录关联不起来,看似没有保存成功。所以基本定位到是在往数据库存储时的顺序问题,因为必须是先有父记录,才能写子记录并把父记录Id保存到子记录的关联中。很可能是Hibernate配置中出现问题
- 因为之前的dll是能保存成功,最新的不能保存成功,所以考虑对比两个dll的差异,寻找问题的根源。最终查找并定位到问题
根源查找(对比dll):
对比两个版本的dll是非常困难的事情,因为命名空间和代码众多。如果只是用反编译工具一行一行的对比的话就太费时间和精力了。所以对比dll也是需要方法的,这里就用了两个非常有用的工具,ILSpy和WinMerge。ILSpy和WinMerge都是免费的,大家可以到百度一搜网上下载,这里就不提供链接了。
- ILSpy负责反编译dll代码,并把代码保存成文件目录的状态
- WinMerge负责对比两个文件夹内容的不同
好的,下面开始讲如何操作
- 用ILSpy打开老版本validation.dll,我们称之为validation_old.dll:File->Open->找到dll
- 把validation_old.dll保存成文件目录的状态:选中validation_old.dll节点->File->Save Code...,保存到文件夹validation_old。图(3-1)
重复上面123的步骤,把新版本validation_new.dll保存到文件夹:validation_old
- 用WinMerge工具,对比两个文件夹,依次查看每个文件的变化,最终定位到Hibernate配置文件中问题的根源:inverse=“true”
- 图(3-2)
问题分析(inverse=“true”):
inverse关键字表示“是否放弃维护关联关系”,默认是false。true放弃维护关联关系。
这里的问题根源就是把inverse=“true”设在了Validations里(如上图右侧错误的配置),导致他们的关联关系没有保存到数据库中。
当去掉inverse=“true”后,就会变成如上图1-1中间记录一样,恢复正常
具体可参考这篇文章:
- https://www.cnblogs.com/little-fly/p/2017-01-05.html
- https://www.mkyong.com/hibernate/inverse-true-example-and-explanation/
总结:
- DLL对比可以使用ILSpy解压后,再通过WinMerge对比
- WinMerge可以对比文件夹的异同,不只用在这里
- Hibernate中的配置使用要理解透彻,不然很容易掉进坑里
由hibernate配置inverse="true"而导致的软件错误,并分析解决此问题的过程的更多相关文章
- Hibernate中inverse="true"的理解
Hibernate中inverse="true"的理解 举例如下 转自:http://lijiejava.iteye.com/blog/776587 Customer类: publ ...
- hibernate之inverse=true相关配置讲解
首先inverse=”true”是在双向关联里面使用单向关联没有这个配置 inverse – 标记由哪一方来维护关联关系(双向关联中会用到) inverse默认值为false 如果inverse设 ...
- 由hibernate配置cascade而导致的软件错误,并分析解决此问题的过程
本文与上一篇文章的软件背景相同,是一个安装部署的工具,这个工具会生成整套系统部署用的xml文件. 这个工具中有一个“克隆”功能,当安装包有新版本后,可以克隆之前的xml版本,并在其基础上做少许修改来适 ...
- Hibernate逍遥游记-第13章 映射实体关联关系-004双向多对多(inverse="true")
1. <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hi ...
- Hibernate 配置 双向 对多关联 (未完待续·······)
从生疏到熟练 是要经历多少遍的练习? 这答案只能向自己找. 以Student和Course为例,一个学生可以选多门课程,一门课程也可以被多个学生选取: 首先 我们创建 ...
- Hibernate配置文档详解
Hibernate配置文档有框架总部署文档hibernate.cfg.xml 和映射类的配置文档 ***.hbm.xml hibernate.cfg.xml(文件位置直接放在src源文件夹即可) (在 ...
- hibernate中 inverse的用法(转载)
http://blog.csdn.net/xiaoxian8023/article/details/15380529 一.Inverse是hibernate双向关系中的基本概念.inverse的真正作 ...
- Hibernate Cascade & Inverse
Cascade - 修改实体表 Inverse - 修改中间表 http://www.cnblogs.com/amboyna/archive/2008/02/18/1072260.html 1.到底在 ...
- Hibernate 配置详解(8)
hibernate.generate_statistics 这个配置大家应该都很熟悉,用于开启Hibernate统计信息,便于对Hibernate相关性能调试提供数据依据.在开发过程当中,可以把这个选 ...
随机推荐
- CodeForces - 580C Kefa and Park 【BFS】
题目链接 http://codeforces.com/problemset/problem/580/C 题意 根节点是 1 然后所有的叶子结点都是饭店 从根节点到叶子结点的路径上 如果存在 大于m 个 ...
- 每天一个Linux命令(34)grep命令
grep(global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具 ...
- android6.0 外部存储设备插拔广播以及获取路径(U盘)【转】
本文转载自:https://blog.csdn.net/zhouchengxi/article/details/53982222 这里我将U盘作为例子来说明解析. android4.1版本时U盘插拔时 ...
- [算法]去掉字符串中连续出现的k个0子串
题目: 给定一个字符串str和一个整数k,如果str中正好有k个‘0’字符出现时,把k个连续的‘0’字符去除,返回处理后的字符串. 举例: str=”A00B”,k=2,返回“AB” str=”A00 ...
- 大话设计模式--享元模式 Flyweight -- C++实现实例
1. 享元模式: 运用共享技术有效地支持大量细粒度的对象. 享元模式可以避免大量非常相似类的开销,在程序设计中,有时需要生成大量颗粒度的类实例来表示数据,如果能发现这些实例除了几个参数外基本都是相同的 ...
- Subnet Pools and Address Scopes
Why is IPAM important for Neutron? •No VM connectivity without a valid IP assigned •Duplicate subne ...
- java:解决eclipse配置Tomcat时找不到server选项
http://blog.csdn.net/wugangsunny/article/details/25246565 集成Eclipse和Tomcat时找不到server选项: 按照网上的步骤如下: 在 ...
- JS多项选择删除
$(document).ready(function(){ $("#batdel").click(function(){ var checkedLen = 0; var check ...
- 分享知识-快乐自己:FastDFS 上传 java 源码
FastDFS 上传 java 源码:点我下载源码 首先导入 POM 文件:解决 maven 不能下载 fastdfs-client-java JAR <dependency> <g ...
- POJ 2240 Arbitrage(Floyed-Warshall算法)
题意:给出n种货币,m种兑换比率(一种货币兑换为另一种货币的比率),判断测试用例中套汇是否可行.(套汇的意思就是在经过一系列的货币兑换之后,是否可以获利.例如:货币i→货币j→货币i,这样兑换后,是否 ...