我為什麼學習Hibernate
我來談談我為什麼學習Hibernate
希望對大家能有點啟發
在我做過的很多項目的過程中
我一直有一個懸而未決的問題在困擾我
那就是持久層的開發
持久層的開發一般來說要麼用CMP
要麼用JDBC+DAO
CMP就不用說了
它對我來說是一種失敗的實踐
而JDBC+DAO也存在很多的困難
我很難做到把關系表記錄完整的映射到持久對象的關系上來
這主要體現在多表的關系無法直接映射到對持久對象的映射上來
可能是一個表映射多個持久對象
有可能是多個表映射一個持久對象
更有可能的是表的某些字段映射到一個持久對象
但是另外一些字段映射到別的持久對象上
而且即使這些問題都處理好了
也不能直接按照對象的方式來對持久對象(PO)編程
因為存在
N關系的持久對象的查詢其實就是
+n次對數據庫的SQL
我曾經有一次失敗的持久層設計
結果是某個關聯很多其它持久對象的PO一查詢就是
n+
次 sql
速度慢的不得了
最後不得不整個修改底層設計
最後等於是完全拋棄了對象設計
完全是按照表字段進行操作
但是這樣做非常難受
因為系統的設計是從需求設計
系統設計這樣自頂而下的
結果都到了詳細設計階段了
被持久層映射問題限制
不得不自底向上修改設計方案
又回到了按照過程進行編程的老路上來
非常的糟糕
我對這個問題思考了很久
最後終於意識到這其實是一個很經典的問題
對象和關系的映射問題
實際上自從OOP編程流行以後
就存在這個難題了
所以才有人提出關系數據庫進行重新設計
改用對象數據庫
但實際上關系數據庫並沒有被淘汰
於是就只能在上層的應用層找解決方案
這時候我明白了我需要的實際上是一種 ORM產品
我最早想到的ORM就是JDO
於是我下載了兩個JDO產品
准備認真的學習一下
但是研究了一段時間之後
我發現我對JDO非常的失望
原因如下
JDO沒有一個好的開源免費實現
好的產品都是商業產品
並且在國內沒有銷售和技術支持
這就造成了JDO只有學習之用
不能把它用在實際項目中
否則的話
你把軟件賣給客戶的時候
還要告訴他
你還要另外去買一個國外的軟件產品
並且在國內沒有技術支持
出了持久層的問題
我們也解決不了
請你自己打國際長途去解決問題
你認為客戶能答應嗎?
JDO不是一個輕量級封裝
它試圖建立一個完整的持久層框架
但是還很不完善
造成了JDO 感覺比較笨重
很多操作方式令人覺得煩瑣和古怪
這加重了程序員學習和編程的負擔
而且封裝的太多會造成一個嚴重的問題就是一旦出現報錯信息
調試起來非常困難
你很難准確的定位錯誤究竟出在哪裡
封裝的越輕
問題越容易定位
越容易解決
封裝的越重
問題越復雜
越找不到原因
CMP就是一個很好的例子
出了錯誤
調試起來非常困難和麻煩
JDO的標准很不完善
存在重大缺陷
最主要的問題體現在PO不能脫離PM(相當於 Hibernate的Session)而存在
這是個非常嚴重的問題
會造成編程的時候進行大量VO的拷貝操作
煩瑣極了
另外一個重大缺陷是靜態的 POJO的Enhancer
不能運行期動態Enhance
無法進行增量編譯和調試
編程和調試起來非常煩瑣
每次都要手共運行一個工具對POJO進行 Enhance
此外還有一些缺陷
例如JDOQL不完善
映射關系的表達不夠強大等等
JDO產品的分裂
這個問題也比較嚴重
由於JDO
標准的缺陷
而JDO
標准還遙遙無期
而各個JDO廠商為了能夠在競爭中脫穎而出
那麼除了在易操作性和性能上的提高之外
想要吸引客戶
就必須有自己的產品特色
那麼
標准的缺陷正好給了他們發揮的舞台
每個廠商都會有自己獨到的解決方案來解決標准的缺陷
然而這卻造成了JDO 產品事實上的分裂
這種分裂嚴重到什麼程度?我可以簡單舉個例子
你寫好的POJO
用一種JDO的Enhancer進行Enhance過以後得到的 PO
在另一個JDO產品上跑不起來
這很像當年Unix的分裂
結果就是二進制代碼級的不兼容
而只能在C源代碼級兼容
現在的JDO也有這樣的趨勢
就像App Server的差別一樣
一個在Weblogic上開發好的EJB
移植到Websphere
你一定需要重新進行配置
我心目中的ORM最好有如下的特點
開源和免費的License
我可以在需要的時候研究源代碼
改寫源代碼
進行功能的定制
輕量級封裝
避免引入過多復雜的問題
調試容易
也減輕程序員的負擔
具有可擴展性
API開放
當本身功能不夠用的時候
可以自己遍碼進行擴展
開發者活躍
產品有穩定的發展保障
拋棄了JDO以後
我根據上面的原則
先後排除了TopLink
CocoBase
Castor等
最後選擇了Apache OJB和Hibernate
OJB的排除很容易做出
一是因為它的文檔太簡單
太少
二是因為OJB計劃下一個版本全面支持JDO
它的API會有重大變動
所以現階段學習OJB是個錯誤
等它的API穩定了以後再學習不遲
Hibernate的發現是很偶然的事情
只是在別人提到JDO的產品中
附帶提了提而已
但當我開始研究Hibernate之後
我發現終於找到了我夢寐以求的ORM了
Hibernate 完全符合我上面提到的標准之外
也解決掉了JDO的所有缺陷
而且方式之優雅令人贊歎
Hibernate的文檔也是非常非常有特色的地方
它不僅僅是 Hibernate的功能介紹那麼簡單
它實際上是一個持久層設計的最佳實踐的經驗總結
文檔裡面的例子
文檔裡面的總結全部都是最佳設計的結晶
我認真的把Hibernate讀下來的感覺就是
不單單把Hibernate掌握住了
而且對持久層的設計的經驗都長了一大塊
以前可從來沒有覺得持久層的設計還有那麼多的學問
也由此感覺到Gavin絕對是一個大牛人
當然選擇Hibernate最最重用的原因是Hibernate是一個我能夠完完全全駕馭的了的軟件
Hibernate的源代碼非常少
而且寫的非常簡潔
我總覺得挺奇怪的
這麼少的源代碼能夠實現這麼多的功能
是個奇跡
Hibernate的源代碼樹分的很清楚簡單
源代碼很易讀
我一旦碰到文檔中沒有講到的問題
或者文檔中提到但是我搞不清楚的地方
我就去源代碼中找
所有的問題都豁然開朗
而且讓我對Hibernate的運行原理和細節搞的特別清楚
好像Hibernate就像自己寫的代碼一樣
很清楚的知道
怎麼寫程序可以讓Hibernate運行效率最高
最省內存
程序出了錯誤
很清楚的知道是什麼地方的問題
怎麼解決
所以用Hibernate讓我特別放心
我能夠駕馭它
而不像那些過於復雜的軟件
本身框架就復雜的很
再加上不開源
出了問題也不知道怎麼回事
我開辦了中國Hibernate技術專業論壇
大家如果對Hibernate有興趣
可以和我來討論
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28408.html