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