從頭到腳跟你解釋什么是Hibernate
2024-07-21 02:15:05
供稿:網友
 
  hibernate是一個免費的開源java包,它使得與關系數據庫打交道變得十分輕松,就像您的數據庫中包含每天使用的普通java對象一樣,同時不必考慮如何把它們從神秘的數據庫表中取出(或放回到數據庫表中)。它解放了您,使您可以專注于應用程序的對象和功能,而不必擔心如何保存它們或稍后如何找到它們。
  
  大多數應用程序都需要處理數據。java應用程序運行時,往往把數據封裝為相互連接的對象網絡,但是當程序結束時,這些對象就會消失在一團邏輯中,所以需要有一些保存它們的方法。有時候,甚至在編寫應用程序之前,數據就已經存在了,所以需要有讀入它們和將其表示為對象的方法。手動編寫代碼來執行這些任務不僅單調乏味、易于出錯,而且會占用整個應用程序的很大一部分開發工作量。
  
  優秀的面向對象開發人員厭倦了這種重復性的勞動,他們開始采用通常的“積極”偷懶做法,即,創建工具,使整個過程自動化。對于關系數據庫來說,這種努力的最大成果就是對象/關系映射(orm)工具。
  
  這類工具有很多,從昂貴的商業產品到內置于j2ee中的ejb標準。然而,在很多情況下,這些工具具有自身的復雜性,使得開發人員必須學習使用它們的詳細規則,并修改組成應用程序的類以滿足映射系統的需要。由于這些工具為應付更加嚴格和復雜的企業需求而不斷發展,于是在比較簡單和常見的場景中,使用它們所面臨的復雜性反而蓋過了所能獲得的好處。這引起了一場革命,促進了輕量級解決方案的出現,而hibernate就是這樣的一個例子。
  
  hibernate的工作方式
  
  hibernate不會對您造成妨礙,也不會強迫您修改對象的行為方式。它們不需要實現任何不可思議的接口以便能夠持續存在。惟一需要做的就是創建一份xml“映射文檔”,告訴hibernate您希望能夠保存在數據庫中的類,以及它們如何關聯到該數據庫中的表和列,然后就可以要求它以對象的形式獲取數據,或者把對象保存為數據。與其他解決方案相比,它幾乎已經很完美了。
  
  由于本文只是一篇介紹性的文章,所以不會引入構建和使用hibernate映射文檔的具體例子(我在《hibernate: a developer's notebook》一書的頭幾章中已經介紹了一個例子)。此外,在網上和hibernate的在線文檔中,還可以找到一些不錯的例子,請參見下面的“其他信息”部分。它實際上相當直觀。應用程序對象中的屬性以一種簡單而自然的方式與正確的數據庫結構相關聯。
  
  運行時,hibernate讀取映射文檔,然后動態構建java類,以便管理數據庫與java之間的轉換。在hibernate中有一個簡單而直觀的api,用于對數據庫所表示的對象執行查詢。要修改這些對象,(一般情況下)只需在程序中與它們進行交互,然后告訴hibernate保存修改即可。類似地,創建新對象也很簡單;只需以常規方式創建它們,然后告訴hibernate有關它們的信息,這樣就能在數據庫中保存它們。
  
  hibernate api學習起來很簡單,而且它與程序流的交互相當自然。在適當的位置調用它,就可以達成目的。它帶來了很多自動化和代碼節省方面的好處,所以花一點時間學習它是值得的。而且還可以獲得另一個好處,即代碼不用關心要使用的數據庫種類(否則的話甚至必須知道)。我所在的公司就曾有過在開發過程后期被迫更換數據庫廠商的經歷。這會造成巨大的災難,但是借助于hibernate,只需要簡單地修改hibernate配置文件即可。
  
  這里的討論假定您已經通過創建hibernate映射文檔,建立了一個關系數據庫,并且擁有要映射的java類。有一個hibernate“工具集”可在編譯時使用,以支持不同的工作流。例如,如果您已經擁有java類和映射文檔,hibernate可以為您創建(或更新)必需的數據庫表。或者,僅僅從映射文檔開始,hibernate也能夠生成數據類。或者,它可以反向設計您的數據庫和類,從而擬定映射文檔。還有一些用于eclipse的alpha 插件,它們可以在ide中提供智能的編輯支持以及對這些工具的圖形訪問。
  
  如果您使用的是hibernate 2環境,這些工具鮮有提供,但是存在可用的第三方工具。
  
  使用hibernate的場合
  
  既然hibernate看起來如此靈活好用,為什么還要使用其他的工具呢?下面有一些場景,可以幫助您做出判斷(或許通過提供一些比較和上下文,可以有助于鑒別非常適用hibernate的場合)。
  
  如果應用對于數據存儲的需要十分簡單——例如,您只想管理一組用戶優先選擇——您根本不需要數據庫,更不用說一個優秀的對象-關系映射系統了(即使它也如hibernate這般易于使用)!從java 1.4開始,有一個標準的java preferences api可以很好地發揮這個作用。(在onjava文章中可以找到有關preferences api的更多信息。)
  
  對于熟悉使用關系數據庫和了解如何執行完美的sql查詢與企業數據庫交互的人來說,hibernate似乎有些礙手礙腳,這就像帶有動力和自動排擋的快艇車會使注重性能的賽車駕駛員不耐煩一樣。如果您屬于這種人,如果您所在的項目團隊擁有一個強大的dba,或者有一些存儲過程要處理,您可能想研究一下ibatis。hibernate的創建者本身就把ibatis當作是另一種有趣的選擇。我對它很有興趣,因為我們曾為一個電子商務站點開發了一個類似的系統(其功能更為強大),而且從那時到現在,我們已經在其他環境中使用過它,盡管在發現hibernate之后,在新項目中我們通常更喜歡使用hibernate。您可以認為,以sql為中心的解決方案(比如ibatis)是“反向的”對象/關系映射工具,而hibernate是一個更為傳統的orm。
  
  當然,還有其他的外部原因會導致采用另外的方法。比如,在一個企業環境中,必須使用成熟的ejb架構(或者其他的一些非普通對象映射系統)。可以為提供自己的數據存儲工具的平臺量身定做代碼,比如mac os x's core data。使用的可能是像xml dtd這樣的存儲規范,而它根本不涉及關系數據庫。
  
  但是,如果您使用的是富對象模型,而且想要靈活、輕松且高效地保存它(無論您是否正要開始或已經決定使用關系數據庫,只要這是一個選擇——而且存在可用的優秀免費數據庫,比如mysql,或可嵌入java的hsqldb,它就應該始終是一個選擇),那么hibernate很可能就是您理想的選擇。您可能會驚訝于節省的時間之多,以及您將會多么地喜歡使用它。
  
  其他信息
  
  hibernate項目有大量的在線文檔,可以幫助您找準方向,快速開始使用。
  
  權威性的參考資料是hibernate in action,作者是christian bauer和gavin king,都是hibernate的創建者。該書全面而基礎地講述了hibernate包的功能和正確的使用方法。
  
  閱讀我的書hibernate: a developer's notebook,也是一種快速上手的好方法。它直接但詳細地講述了如何在java項目中設置hibernate,以及如何使用它的一些最重要的功能。其中的代碼示例普遍基于hibernate和hsqldb的早期版本,所以如果您想不加改動地使用它們,需要使用這兩種軟件的正確版本。無論如何,基本的概念是正確的,而且我希望能夠盡快地針對hibernate 3更新本書。
  
  另一本有趣的書是better faster lighter java,作者是bruce tate 和justin gehtland。書中給出了一些實用方法,可以以合理的方式完成實際的項目,這也是它流行的原因之一。它在如何評估和使用(或否決)可用的java技術方面給出了合理建議,并作為正確方法的例子提到了hibernate和spring。
  
  最后,“working with hibernate in eclipse”(它預先提到了更強大的新的alpha版的hibernate 3工具)中詳細講述了如何將一個叫做hibernate synchronizer的eclipse插件與hibernate一起使用。