由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相关性能调试提供数据依据.在开发过程当中,可以把这个选 ...
随机推荐
- 运用starling开发的手游FlappyBird
最近想向游戏方面发展,于是用starling做了一个简易版的FlappyBird,纯AS3开发,权当是技术学习.在发布之后才明白要发布一个没有版权的app是有多困难,审核了N遍之后终于通过审核,下面发 ...
- 【Flask】Sqlalchemy 常用数据类型
### SQLAlchemy常用数据类型:1. Integer:整形,映射到数据库中是int类型.2. Float:浮点类型,映射到数据库中是float类型.他占据的32位.3. Double:双精度 ...
- 单链表(C++实现)
单链表的结构有多种 这里介绍的链表有头结点.有尾节点并且尾节点指向头结点 单链表的每个结点的地址存放在其直接前驱结点的指针域中.其中第一个结点没有前驱结点,因此需要一个头指针指向第一个节点,便于我们对 ...
- STL讲解报告
三十分钟掌握STL STL概述 STL的一个重要特点是数据结构和算法的分离.尽管这是个简单的概念,但这种分离确实使得STL变得非常通用.例如,由于STL的sort()函数是完全通用的,你可以用它来操作 ...
- HDU1232 畅通工程,并查集
这里要补充一些知识点,并查集三操作 1.找到父节点递归写法int Findf(int x){ if(father[x]!=x) father[x]=Findf(father[x]); return f ...
- BZOJ 1597 [Usaco2008 Mar]土地购买:斜率优化dp
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1597 题意: 有n块矩形土地,长为a[i],宽为b[i]. FJ想要将这n块土地全部买下来 ...
- HTTP-接触
[HTTP]http是基于TCP/IP协议的应用层协议,他不涉及数据包(packet)传输,主要规定了客户端和服务器之间的通信格式,默认端口是80端口. 不同版本http协议里的相关概念[Conten ...
- 理解VMware虚拟网络
简述:VMware虚拟网络概述.实现虚拟网络上网 Part0 子网掩码.DHCP.NAT,这些点请自行百度,百度百科讲的很清晰. Part1 转载:本文出自 "王春海的博客" 博客 ...
- 使用CSS3制作酷炫防苹果复选框 自行测试!
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Java_JS_01_java调用js
二.资源帖 1.JAVA执行javascript方法 2.在Java中直接调用js代码 3.Java执行js脚本 4.Java 8 Nashorn 教程 5.Java 脚本引擎