Hibernate是一個免費的開源Java包它使得與關系數據庫打交道變得十分輕松就像您的數據庫中包含每天使用的普通Java對象一樣同時不必考慮如何把它們從神秘的數據庫表中取出(或放回到數據庫表中)它解放了您使您可以專注於應用程序的對象和功能而不必擔心如何保存它們或稍後如何找到它們
歷史與背景
大多數應用程序都需要處理數據Java應用程序運行時往往把數據封裝為相互連接的對象網絡但是當程序結束時這些對象就會消失在一團邏輯中所以需要有一些保存它們的方法有時候甚至在編寫應用程序之前數據就已經存在了所以需要有讀入它們和將其表示為對象的方法手動編寫代碼來執行這些任務不僅單調乏味易於出錯而且會占用整個應用程序的很大一部分開發工作量
優秀的面向對象開發人員厭倦了這種重復性的勞動他們開始采用通常的積極偷懶做法即創建工具使整個過程自動化對於關系數據庫來說這種努力的最大成果就是對象/關系映射(ORM)工具
這類工具有很多從昂貴的商業產品到內置於JEE中的EJB標准然而在很多情況下這些工具具有自身的復雜性使得開發人員必須學習使用它們的詳細規則並修改組成應用程序的類以滿足映射系統的需要由於這些工具為應付更加嚴格和復雜的企業需求而不斷發展於是在比較簡單和常見的場景中使用它們所面臨的復雜性反而蓋過了所能獲得的好處這引起了一場革命促進了輕量級解決方案的出現而Hibernate就是這樣的一個例子
Hibernate的工作方式
Hibernate不會對您造成妨礙也不會強迫您修改對象的行為方式它們不需要實現任何不可思議的接口以便能夠持續存在惟一需要做的就是創建一份XML映射文檔告訴Hibernate您希望能夠保存在數據庫中的類以及它們如何關聯到該數據庫中的表和列然後就可以要求它以對象的形式獲取數據或者把對象保存為數據與其他解決方案相比它幾乎已經很完美了
由於本文只是一篇介紹性的文章所以不會引入構建和使用Hibernate映射文檔的具體例子(我在《Hibernate: A Developers Notebook》一書的頭幾章中已經介紹了一個例子)此外在網上和Hibernate的在線文檔中還可以找到一些不錯的例子請參見下面的其他信息部分它實際上相當直觀應用程序對象中的屬性以一種簡單而自然的方式與正確的數據庫結構相關聯
運行時Hibernate讀取映射文檔然後動態構建Java類以便管理數據庫與Java之間的轉換在Hibernate中有一個簡單而直觀的API用於對數據庫所表示的對象執行查詢要修改這些對象(一般情況下)只需在程序中與它們進行交互然後告訴Hibernate保存修改即可類似地創建新對象也很簡單只需以常規方式創建它們然後告訴Hibernate有關它們的信息這樣就能在數據庫中保存它們
Hibernate API學習起來很簡單而且它與程序流的交互相當自然在適當的位置調用它就可以達成目的它帶來了很多自動化和代碼節省方面的好處所以花一點時間學習它是值得的而且還可以獲得另一個好處即代碼不用關心要使用的數據庫種類(否則的話甚至必須知道)我所在的公司就曾有過在開發過程後期被迫更換數據庫廠商的經歷這會造成巨大的災難但是借助於Hibernate只需要簡單地修改Hibernate配置文件即可
這裡的討論假定您已經通過創建Hibernate映射文檔建立了一個關系數據庫並且擁有要映射的Java類有一個Hibernate工具集可在編譯時使用以支持不同的工作流例如如果您已經擁有Java類和映射文檔Hibernate可以為您創建(或更新)必需的數據庫表或者僅僅從映射文檔開始Hibernate也能夠生成數據類或者它可以反向設計您的數據庫和類從而擬定映射文檔還有一些用於Eclipse的alpha 插件它們可以在IDE中提供智能的編輯支持以及對這些工具的圖形訪問
如果您使用的是Hibernate 環境這些工具鮮有提供但是存在可用的第三方工具
使用Hibernate的場合
既然Hibernate看起來如此靈活好用為什麼還要使用其他的工具呢?下面有一些場景可以幫助您做出判斷(或許通過提供一些比較和上下文可以有助於鑒別非常適用Hibernate的場合)
如果應用對於數據存儲的需要十分簡單——例如您只想管理一組用戶優先選擇——您根本不需要數據庫更不用說一個優秀的對象關系映射系統了(即使它也如Hibernate這般易於使用)!從Java 開始有一個標准的Java Preferences API可以很好地發揮這個作用(在ONJava文章中可以找到有關Preferences API的更多信息)
對於熟悉使用關系數據庫和了解如何執行完美的SQL查詢與企業數據庫交互的人來說Hibernate似乎有些礙手礙腳這就像帶有動力和自動排擋的快艇車會使注重性能的賽車駕駛員不耐煩一樣如果您屬於這種人如果您所在的項目團隊擁有一個強大的DBA或者有一些存儲過程要處理您可能想研究一下iBATISHibernate的創建者本身就把iBATIS當作是另一種有趣的選擇我對它很有興趣因為我們曾為一個電子商務站點開發了一個類似的系統(其功能更為強大)而且從那時到現在我們已經在其他環境中使用過它盡管在發現Hibernate之後在新項目中我們通常更喜歡使用Hibernate您可以認為以SQL為中心的解決方案(比如iBATIS)是反向的對象/關系映射工具而Hibernate是一個更為傳統的ORM
當然還有其他的外部原因會導致采用另外的方法比如在一個企業環境中必須使用成熟的EJB架構(或者其他的一些非普通對象映射系統)可以為提供自己的數據存儲工具的平台量身定做代碼比如Mac OS Xs Core Data使用的可能是像XML DTD這樣的存儲規范而它根本不涉及關系數據庫
但是如果您使用的是富對象模型而且想要靈活輕松且高效地保存它(無論您是否正要開始或已經決定使用關系數據庫只要這是一個選擇——而且存在可用的優秀免費數據庫比如MySQL或可嵌入Java的HSQLDB它就應該始終是一個選擇)那麼Hibernate很可能就是您理想的選擇您可能會驚訝於節省的時間之多以及您將會多麼地喜歡使用它
其他信息
Hibernate項目有大量的在線文檔可以幫助您找准方向快速開始使用
權威性的參考資料是Hibernate in Action作者是Christian Bauer和Gavin King都是Hibernate的創建者該書全面而基礎地講述了Hibernate包的功能和正確的使用方法
閱讀我的書Hibernate: A Developers Notebook也是一種快速上手的好方法它直接但詳細地講述了如何在Java項目中設置Hibernate以及如何使用它的一些最重要的功能其中的代碼示例普遍基於Hibernate和HSQLDB的早期版本所以如果您想不加改動地使用它們需要使用這兩種軟件的正確版本無論如何基本的概念是正確的而且我希望能夠盡快地針對Hibernate 更新本書
另一本有趣的書是Better Faster Lighter Java作者是Bruce Tate 和Justin Gehtland書中給出了一些實用方法可以以合理的方式完成實際的項目這也是它流行的原因之一它在如何評估和使用(或否決)可用的Java技術方面給出了合理建議並作為正確方法的例子提到了Hibernate和Spring
最後Working with Hibernate in Eclipse(它預先提到了更強大的新的alpha版的Hibernate 工具)中詳細講述了如何將一個叫做Hibernate Synchronizer的Eclipse插件與Hibernate一起使用
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28158.html