Hibernate實戰的詳細分析
對象關系映射(ObjectRelativeMapping)簡稱ORM,是面向對象開發的一個熱點,用來解決JDBC開發中手動進行OR映射的繁雜與不便。EJB中的實體Bean在這個領域是很著名的——既因為它的先進而著名,也因為它的低效而著名。有過實體Bean開發經驗的人可能都會為實現遠程接口造成的效率低下而頭痛,在很多不大不小的項目中,使用實體Bean是否得不償失,爭論很大。一個輕量級的持久化方案也許能夠解決一些問題,Hibernate應此而生。
Hibernate是一個中間層,它的目的是把數據庫中的關系通過一定的規則映射成為對象,讓Java開發人員不用太多的考慮底層數據庫的問題,只需要像通常情況下管理對象一樣的管理數據。在關系數據庫仍將持續占據市場的情況下,它很可觀。在數據持久化領域,即便是輕量級的方案也會是復雜饒舌的,也許如同周杰倫的音樂一樣不知所云。在學習它之前,最好先回想一下以前進行數據庫開發中遇到的問題和不便,想想為什么需要一個持久化層,才能知道很多操作的目的是什么,以及為什么要這么干,在這個問題上我不想做更多的敘述,因為“長久以來……”這樣的句式通常long(不好意思,打不出來)長,會對我的鍵盤和熱情造成很大的磨損。如果讓我寫一本書,那么我會樂意去敘述什么是數據持久化,它有什么好處等等。廢話少說,來了。
首先需要配置環境,下載Hibernate(www.hibernate.org),把lib下的*.jar添加到classpath,你的數據庫JDBC驅動程序也應該在classpath中。打開hibernate.properties,針對你使用的數據庫,配置相應的信息,比如我使用的是MSSQLServer,配置如下:
##MSSQLServer hibernate.dialectnet.sf.hibernate.dialect.SQLServerDialect |
其中很大部分是已經寫好的,只需要取掉注釋即可,我自己只是修改了數據庫名稱、帳號、密碼。建立一個名為zizz的數據庫備用。
然后把這個文件拷貝到你的應用的根目錄下。
我們談論了很多次映射,在Hibernate實戰中應該首先來看看這個映射是如何完成的。假設一個最簡單的應用,寫一個功能最單一的留言板,設計的數據有留言的編號、留言者名稱、留言內容,還有留言時間。足夠簡單吧,換做是你打算怎么干?我猜你要首先建立一個數據庫表格,名字也許叫做guestbook。No,這不是面向對象的方式,不妨首先從對象的角度來考慮。我們當然希望每一條留言都以對象的方式呈現,每個對象應該具有的屬性有:id、author、content、time。偷個懶,沒有畫UML。下面這個類應該是很容易理解的:
//GuestBook.java importjava.util.*; publicclassGuestBook privatevoidsetId(intid) publicvoidsetAuthor(Stringauthor) publicvoidsetContent(Stringcontent) publicvoidsetTime(Calendartime) |
基本上是Hibernate實戰中最簡單的Bean了,如果覺得困難的話,請你先回火星等我。
需要注意的是setId方法被指定為private,這是因為我希望用這個字段做主鍵,它最好由系統自動生成,所以不應該由用戶來指定,這個方法專為Hibernate準備,所以是私有的。
如何把這個類與數據庫映射起來?看看Hibernate的魔法,使用一個XML文件來描述,它應該被命名為GuestBook.hbm.xml:
|
雖然有點陌生,但是很易讀,仔細琢磨一下。
下面來編寫我們的應用,它的功能是插入數據:
//Operate.java publicclassOperate GuestBookgb=newGuestBook(); Transactionts=session.beginTransaction(); |
到數據庫里面看看,表格已經建立好了,并且數據也已經保存。如果把
newSchemaExport().create(true,true);
注釋掉,那么系統不會創建表格,而只是在已有的表格中添加新的記錄,當然,如果表格不存在的話,會產生異常。
你已經看到了Hibernate實戰神奇魔法的5%,它足夠的復雜強大,可以讓你應付復雜的應用,不過今天還是到此為止吧。
【編輯推薦】