由hibernate配置inverse="true"而致使的軟件錯誤,並分析解決此問題的過程

題目背景軟件是用來作安裝部署的工具,在部署一套系統時會有不少安裝包,經過此工具,能夠生成一個xml文件用以保存每一個安裝包的文件位置、順序、參數、所需腳本、依賴條件驗證(OS、.net、IIS、數據版本等),有了這個定義好的xml就能夠垂手可得的安裝很是多的安裝包(有一個專門解析此xml的軟件來操做)。html

今天要介紹的問題發生在生成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都是免費的,你們能夠到百度一搜網上下載,這裏就不提供連接了。.net

  • ILSpy負責反編譯dll代碼,並把代碼保存成文件目錄的狀態
  • WinMerge負責對比兩個文件夾內容的不一樣

  好的,下面開始講如何操做hibernate

  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放棄維護關聯關係。xml

  這裏的問題根源就是把inverse=「true」設在了Validations裏(如上圖右側錯誤的配置),致使他們的關聯關係沒有保存到數據庫中。htm

  當去掉inverse=「true」後,就會變成如上圖1-1中間記錄同樣,恢復正常對象

  具體可參考這篇文章:blog

  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中的配置使用要理解透徹,否則很容易掉進坑裏
相關文章
相關標籤/搜索