熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java開源技術 >> 正文

我為什麼學習Hibernate

2013-11-23 20:22:59  來源: Java開源技術 

  我為什麼學習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以後我根據上面的原則先後排除了TopLinkCocoBaseCastor等最後選擇了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
  • 上一篇文章:

  • 下一篇文章:
  • 推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.