介紹
最近我開(kāi)始使用Eclipse作為我的開(kāi)發(fā)環(huán)境,部分原因是因?yàn)樵谖疫M(jìn)行開(kāi)發(fā)的許多平臺(tái)上都可以使用Eclipse來(lái)工作,還有部分原因是因?yàn)镋clipse是展示人人皆可作出貢獻(xiàn)的開(kāi)放、可擴(kuò)展環(huán)境的優(yōu)勢(shì)的一個(gè)極好的例子。我開(kāi)始研究其他人提供的對(duì)Eclipse的擴(kuò)展。例如,當(dāng)用到xml文件時(shí),我使用XMLBuddy插件。該插件對(duì)于我的工作很有助益。因?yàn)樽罱恢痹趯?xiě)Developer‘s Notebook,所以我很想知道是不是已經(jīng)有人寫(xiě)了關(guān)于Hibernate的插件,事實(shí)上,有好幾個(gè)這樣的插件正在開(kāi)發(fā)。在這篇文章中,我們將探索其中之一:Hibernate Synchronizer. Hibernate Synchronizer 在我找的和Hibernate有關(guān)的插件中,Hibernate Synchronizer最令我感興趣,因?yàn)樗鼮槲以贒eveloper‘s Notebook書(shū)中采用的以映射為中心的工作流(mapping-centric workflow)提供了最好的支持。(可以用多種方法使用Hibernate,你可能會(huì)試試其它一些插件,它們提供的方法可能正是你自己特定環(huán)境所要求的)。事實(shí)上,當(dāng)使用Hibernate Synchronizer時(shí),如果你改變了映射文件,你不需要為更新相應(yīng)的java文件而勞心費(fèi)神。當(dāng)你編輯映射文件時(shí),和Eclipse采取的方法類(lèi)似,該插件自動(dòng)更新你的java代碼。還不止于此,還提供了比Hibernate內(nèi)建的代碼生成工具更多的功能:它為每個(gè)映射對(duì)象創(chuàng)建一對(duì)類(lèi)( a pair of classes),其中一個(gè)是基礎(chǔ)類(lèi),當(dāng)你改變映射內(nèi)容時(shí),它可以隨意重寫(xiě)這個(gè)類(lèi);另一個(gè)類(lèi)作為該基礎(chǔ)類(lèi)的子類(lèi),在子類(lèi)中,你可以添加具體的商業(yè)邏輯和另一些代碼。使用這個(gè)插件生成java代碼時(shí),不用象使用Hibernate內(nèi)置的代碼生成工具那樣,擔(dān)心其它代碼(如商業(yè)邏輯的代碼)會(huì)在你的眼皮底下消失。 對(duì)于以Hibernate影射文檔為基礎(chǔ)的方法,還有一些其它的好處,Hibernate Synchronizer有一個(gè)新編輯器,當(dāng)編輯這類(lèi)文件時(shí),為Eclipse添加了智能輔助和自動(dòng)完成功能。一個(gè)比較好的、以DTD驅(qū)動(dòng)的XML編輯器,如以前提及的XMLBuddy,也可以完成部分功能。與此相比,Hibernate Synchronizer利用對(duì)影射文檔語(yǔ)義的了解,提供了更進(jìn)一步的功能。例如,提供了對(duì)屬性和影射關(guān)系的可視化顯示,創(chuàng)建新元素的向?qū)Ы缑?,象以上提及的一樣,缺省設(shè)置情況下,當(dāng)你編輯影射文檔時(shí),編輯器會(huì)自動(dòng)生成數(shù)據(jù)訪(fǎng)問(wèn)類(lèi)(data-access class). 當(dāng)然還有其它一些功能,在Eclipse的新建(New)菜單中,提供了一個(gè)向?qū)В梢杂脕?lái)創(chuàng)建Hibernate配置文件和映射文件,在包資源瀏覽器(package explorer)和其它一些合適的地方增加了上下文菜單,方便調(diào)用和Hibernate相關(guān)的功能。 好了,在這些抽象的描述之后,到了開(kāi)始做實(shí)事的時(shí)候,當(dāng)然,這正是你興趣所在,不然你就不會(huì)讀這篇文章。怎么安裝和使用呢?下邊一一解釋。 安裝 Hibernate Synchronizer可以用Eclipse內(nèi)置的更新管理器(Update Manager)來(lái)安裝。對(duì)Eclipse 2.1和即將發(fā)布的Eclipse 3的用戶(hù)提供了不同的更新站點(diǎn)。(因?yàn)橛肊clipse作關(guān)鍵性的工作,我仍使用作為產(chǎn)品發(fā)行的2.1版。當(dāng)我寫(xiě)這篇文章的時(shí)候,Eclipse 3已經(jīng)進(jìn)入了“候選發(fā)布”階段。我希望當(dāng)我今夏晚些時(shí)候從JavaOne回來(lái)時(shí),我可以更新到版本3的產(chǎn)品發(fā)行版。提及這個(gè)的主要原因是因?yàn)槲蚁霃?qiáng)調(diào)一下,這些指南是以Eclipse 2的角度的來(lái)講解,毫無(wú)疑問(wèn),一些命令和窗口會(huì)在版本3中發(fā)生變化,因此,當(dāng)你使用Eclipse 3時(shí),你應(yīng)當(dāng)做一些相應(yīng)的調(diào)整。我印象中Hibernate Synchronizer自己的install instructions是針對(duì)Eclipse 3,也許這對(duì)你有所幫助。 啟動(dòng)Eclipse,順次單擊幫助(Help) ->軟件更新(Software Updates) -> 更新管理器(Update Manager)來(lái)打開(kāi)更新管理器,當(dāng)安裝/更新(Install/Update)透視圖打開(kāi)之后,在功能更新視圖(Feature Updates)中用右鍵單擊(如果你用的單鍵,你需要control-click)。選擇新建(New) -> 站點(diǎn)書(shū)簽(Site Bookmark),如圖1中所示。
在彈出對(duì)話(huà)框中,輸入適合你的Eclipse版本的插件地址: ·Eclipse 2.1: http://www./hibernatesync/eclipse2.1 ·Eclipse 3: http://www./hibernatesync 還需要為新建的書(shū)簽命名,"Hibernate Synchronizer"就是個(gè)很貼切的名字。圖2中顯示的是在Eclipse 2.1.2中填完所有需要的信息后的對(duì)話(huà)框。填完之后,你可單擊完成(Finish)按鈕來(lái)完成增加書(shū)簽。
單擊完成(Finish)后,新建的書(shū)簽就會(huì)出現(xiàn)在功能更新(Feature Updates) 視圖中,如圖3中所示.
為了實(shí)際安裝該插件,單擊該書(shū)簽左邊的三角形符號(hào),然后再次單擊在書(shū)簽下邊出現(xiàn)的條目左邊的三角形符號(hào),繼續(xù)這個(gè)過(guò)程,一直到書(shū)簽下邊出現(xiàn)的條目中出現(xiàn)該插件的圖標(biāo)。單擊該條目,就會(huì)出現(xiàn)一個(gè)可以讓你安裝的界面,如圖4所示。
單擊Install Now,讓Eclipse引導(dǎo)你完成安裝(如圖5-10).
你可以看看下邊Trade-Offs部分對(duì)許可協(xié)議的一些討論。當(dāng)你打算在實(shí)際的項(xiàng)目中使用該插件時(shí),想必你會(huì)仔細(xì)研究該協(xié)議。我認(rèn)為也許好一點(diǎn),不過(guò)該插件基于GPL協(xié)議,而不是開(kāi)放源代碼,令人迷惑。
現(xiàn)在已經(jīng)完成安裝,你需要退出,然后重新啟動(dòng)Eclipse以使所做的更改生效??瓷线叺膶?duì)話(huà)框好像說(shuō)能夠自動(dòng)重新啟動(dòng)Eclipse。,以我的經(jīng)驗(yàn),Eclipse只會(huì)退出,還是需要你自己手工重新啟動(dòng)。這可能是Max OS X平臺(tái)上Eclipse 2.1的一個(gè)局限。Eclipse 3已經(jīng)許諾把對(duì)OS X的支持列入第一級(jí)別。無(wú)論如何,這只是個(gè)小問(wèn)題。如果你需要重新啟動(dòng)Eclipse,現(xiàn)在就可以這樣做。安裝完之后,接著需要對(duì)其對(duì)其進(jìn)行配置,以便在項(xiàng)目中使用。 配置 重新啟動(dòng)Eclipse后,關(guān)閉安裝/更新透視圖。打開(kāi)一個(gè)使用Hibernate的Java工程.如果你已經(jīng)完成了Developer‘s Notebook,一書(shū)中的例子,那么就有幾個(gè)目錄可供你選擇,這里以書(shū)中第三章中的例子來(lái)說(shuō)明。第三章是可以在線(xiàn)免費(fèi)獲得的樣章,你還可以從該書(shū)的站點(diǎn)下載所有例子的源代碼。 如果你打算使用其中的一個(gè)例子來(lái)新建一個(gè)Eclipse工程,選擇文件(File) ->新建( New )-> 工程(Project),選定工程類(lèi)型,然后單擊下一步(Next),填入該工程名(我填的是"Hibernate Ch3",如圖11所示),不要復(fù)選使用缺省檢查框(Use default),這樣你可以告訴Eclipse從哪里找到已經(jīng)存在的工程目錄,單擊瀏覽按鈕(Browse)來(lái)定位目錄。選定工程目錄后可以單擊完成(Finish)來(lái)創(chuàng)建工程。不過(guò),一般情況下我喜歡單擊下一步(Next)來(lái)復(fù)查Eclipse為此工程所作的設(shè)置(當(dāng)然,如果發(fā)現(xiàn)有些配置不對(duì),總是可以選擇回退來(lái)修改這些設(shè)置。不過(guò),我總是發(fā)現(xiàn),如果有一個(gè)庫(kù)文件丟失或是其它一些原因,會(huì)有非常多的錯(cuò)誤和警告信息)。
在當(dāng)前情況下,我的謹(jǐn)慎有點(diǎn)多余。Eclipse準(zhǔn)確的算出了目錄是如何組織以及是用來(lái)干什么的,找到我為使用Hibernate和 HSQLDB 數(shù)據(jù)庫(kù)而下載的第三方庫(kù)(下載和安裝的詳細(xì)過(guò)程可以參看書(shū)中第一章)。如此聰明的適應(yīng)能力是Eclipse優(yōu)點(diǎn)之一。圖12顯示新工程已經(jīng)打開(kāi),準(zhǔn)備好可以用來(lái)做實(shí)驗(yàn)。從這個(gè)圖中也可以推斷Eclipse不喜歡調(diào)整窗口大小使其小到形成合適的屏幕布局。從現(xiàn)在開(kāi)始,顯示的屏幕截圖只顯示窗口的一部分,而不是完整的窗口。
下一個(gè)需要做的工作是創(chuàng)建一個(gè)Hibernate配置文件,提供給Hibernate Synchronizer使用。在src目錄中已經(jīng)有了一個(gè)hibernate.properties文件,這是書(shū)中例子使用的配置。這里有個(gè)問(wèn)題,壞消息是Hibernate Synchronizer只能使用XML樣式的Hibernate配置文件。這樣,就需要把hibernate.properties中的內(nèi)容移植到XML樣式的配置文件hibernate.cfg.xml中。好消息是,這正是Hibernate Synchronizer創(chuàng)建配置文件向?qū)У谝淮未箫@身手的時(shí)候。選擇文件(File) ->新建(New) -> 其它(Other),然后在彈出對(duì)話(huà)框選取剛可用的Hibernate類(lèi),選取 Hibernate Configuration File,然后單擊下一步(Next).
打開(kāi)向?qū)r(shí),保存文件的位置和在Eclipse中現(xiàn)在選擇的文件有關(guān)。請(qǐng)確保把該文件保存在src 目錄中。添加其余一些向?qū)枰男畔?,這些信息應(yīng)該和配置文件的版本相一致,如圖14中所示。值得注意的是,和用Ant來(lái)控制Hibernate的運(yùn)行(書(shū)中使用就是這種方法)不同,這里你無(wú)法控制Hibernate運(yùn)行時(shí)的當(dāng)前工作目錄,因此你需要在URL文件中使用路徑的全稱(chēng)。我自己的添加的URL值(有點(diǎn)難看)為 jdbc:hsqldb:/Users/jim/Documents/Work/OReilly/Hibernate/Examples/ch03/data/music. (如果有人知道怎么讓Eclipse或是Hibernate Synchronizer使用一個(gè)工程特定的目錄,你可以告訴我,我很想知道。因?yàn)槲也砰_(kāi)始使用Eclipse,是個(gè)新手。如果有人告訴我這是可能的,只是因?yàn)槲也恢涝趺醋龆?,我一點(diǎn)也不會(huì)感到吃驚)
添加Driver Class 的方法有點(diǎn)奇怪,你需要單擊Browse按鈕,然后開(kāi)始輸入driver的類(lèi)名(譯者注:你需要確定該driver類(lèi)在該工程的類(lèi)路徑中)。如果你輸入"jdbcD",窗口就會(huì)出現(xiàn)這個(gè)選擇,很容易就可以從中選取一個(gè)。具體如圖15所示。
只要添加如圖14中那些屬性值就可以。完成后單擊Finish來(lái)完成創(chuàng)建配置文件。Hibernate Synchronizer 現(xiàn)在已經(jīng)可以開(kāi)始使用了。完成創(chuàng)建文件后,配置文件會(huì)打開(kāi),這時(shí)候你就可以看看Hibernate XML格式的配置文件的結(jié)構(gòu)和細(xì)節(jié)。
要想測(cè)試配置文件是否可用,有一個(gè)又快又簡(jiǎn)單的方法:使用向?qū)?lái)創(chuàng)建一個(gè)影射文件。選擇文件(File) -> 新建(New) -> 其它(Other),選取Hibernate類(lèi)別,然后再選Hibernate 影射文件,單擊下一步(Next)。向?qū)С霈F(xiàn)的時(shí)候,其中有些屬性已經(jīng)自動(dòng)填入了在配置文件中相應(yīng)屬性的值,單擊Refresh(確保可以通過(guò)這些信息和你的數(shù)據(jù)庫(kù)相連)。和數(shù)據(jù)庫(kù)連接后,會(huì)顯示庫(kù)中的表,這里只有一個(gè)TRACK表。第一次使用的時(shí)候,不知什么原因,需要你指定包含HSQLDB驅(qū)動(dòng)的.jar文件的路徑。好在你只需要指定一次。只要你認(rèn)為工作正常(譯者注:顯示了數(shù)據(jù)庫(kù)中有權(quán)限訪(fǎng)問(wèn)的表),單擊Cancel。試驗(yàn)中使用已有的影射文件,不需要實(shí)際創(chuàng)建一個(gè)。 生成代碼 這可能是你一直在等待的部分。我們能用這個(gè)插件來(lái)做什么?好,馬上就開(kāi)始。為Hibernate影射文檔提供一個(gè)新的菜單條目。 右擊(如果是單鍵鼠標(biāo),在按住Control鍵的同時(shí)點(diǎn)鼠標(biāo)鍵)一個(gè)影射文檔,菜單條目中會(huì)顯示幾個(gè)和Hibernate相關(guān)的選擇(如圖17所示),其中有一個(gè)和synchronize有關(guān),這是一個(gè)手工方法,可以讓Hibernate Synchronizer產(chǎn)生和該影射文檔相對(duì)應(yīng)的數(shù)據(jù)訪(fǎng)問(wèn)對(duì)象。
Add Mapping Reference 選項(xiàng)也很有用,當(dāng)你單擊該項(xiàng)時(shí),會(huì)把相應(yīng)的影射文件增加到Hibernate配置文件中,表明該文件是影射文檔,因此你不需要在源代碼中增加任何信息要求相應(yīng)的影射文件進(jìn)行設(shè)置?,F(xiàn)在讓我們看看選取Synchronize Files后的結(jié)果。 事情開(kāi)始變得有趣,出現(xiàn)了兩個(gè)子包,一個(gè)是“base”的DAO,Hibernate Synchronizer所有,可以在任何時(shí)候重寫(xiě),一個(gè)是繼承那些DAO類(lèi)的商業(yè)對(duì)象,不會(huì)被覆蓋,也就給了我們一個(gè)機(jī)會(huì),可以在其中加入商業(yè)邏輯(具體如圖18中所示)。
和Hibernate的代碼生成工具相比,用該插件生成了更多的類(lèi)。這是優(yōu)點(diǎn),也可能是一些潛在的缺點(diǎn),將在Trade-Offs 部分進(jìn)行討論。你可以在工程配置文件中選取要生成的類(lèi)和它們所在的包的結(jié)構(gòu)。我可以證明這點(diǎn),但現(xiàn)在的發(fā)行版有個(gè)bug ,,無(wú)法訪(fǎng)問(wèn)Mac OS X上的配置界面。針對(duì)該bug的一個(gè)補(bǔ)丁已經(jīng)做好了,但仍沒(méi)有發(fā)布。 基于Hibernate Synchronizer網(wǎng)頁(yè)上的例子,和以下這個(gè)類(lèi)一起,用那些新的數(shù)據(jù)訪(fǎng)問(wèn)對(duì)象來(lái)試著把一些數(shù)據(jù)放入數(shù)據(jù)庫(kù)中??雌饋?lái)和標(biāo)準(zhǔn)的Hibernate代碼生成工具生成的版本(在Hibernate: A Developer‘s Notebook一書(shū)的39-40頁(yè))很相似,甚至更簡(jiǎn)單一些。因?yàn)镠ibernate Synchronizer生成的類(lèi)為你的每個(gè)數(shù)據(jù)庫(kù)操作都創(chuàng)建和提交一個(gè)新事務(wù),因此在與此類(lèi)似的簡(jiǎn)單情況下,你不需要自己來(lái)設(shè)置事務(wù)(當(dāng)然,如果你需要把一組操作作為一個(gè)單獨(dú)事務(wù),有很多方法可以做到這點(diǎn))這里是新版本的代碼。
當(dāng)我寫(xiě)這個(gè)的時(shí)候,有Eclipse在手邊真是太好了 ,我已經(jīng)忘了當(dāng)寫(xiě)書(shū)中例子的時(shí)候多么想念智能代碼完成功能,有另外幾件事情JDT也發(fā)揮了作用。 為了在Eclipse中運(yùn)行這個(gè)簡(jiǎn)單的程序,需要設(shè)置一個(gè)新的運(yùn)行配置。用CreateTest2.java作為當(dāng)前文件,選擇運(yùn)行(Run )-> 運(yùn)行...(Run...)。然后單擊新建(New),因?yàn)樵擃?lèi)有一個(gè)main() 方法,Eclipse推斷出要運(yùn)行該工程的當(dāng)前類(lèi)。Eclipse為新的運(yùn)行配置取的名字,CreateTest2,很合適。屏幕窗口看起來(lái)如圖19中所示,單擊運(yùn)行來(lái)在數(shù)據(jù)庫(kù)中創(chuàng)建一些數(shù)據(jù)。
如果你確實(shí)按照上邊說(shuō)的來(lái)做,你會(huì)發(fā)現(xiàn)第一次的嘗試運(yùn)行失敗。Hibernate抱怨配置文件中連一個(gè)映射文件都沒(méi)有參考,為了運(yùn)行程序,至少需要一個(gè)這樣的文件。這也是為什么XMLBuddy在圖16底部用黃色下劃線(xiàn)發(fā)出警告。可以很容易修改該錯(cuò)誤,你只要在包資源瀏覽器(Package Explorer)中的Track.hbm.xml這個(gè)影射文檔上單擊右鍵,在Hibernate Synchronizer子菜單中選取Add Mapping Reference(如圖17中所示),這樣X(jué)MLBuddy就不會(huì)再抱怨XML文件有錯(cuò)誤,程序也可以繼續(xù)向前。不幸的是,沒(méi)有向前推進(jìn)我們所愿的那樣遠(yuǎn),下一個(gè)問(wèn)題又出來(lái)了。Eclipse中顯示的下一個(gè)錯(cuò)誤是“不能在JNDI中找到JTA UserTransaction initial context”。不止我一個(gè)人犯這種錯(cuò)誤,因?yàn)樵赼 forum thread中有這樣的討論,而且到目前為止仍然沒(méi)有找到一個(gè)解決方法。 既然我知道不需要使用JTA,我倒是很想知道為什么Hibernate竟然會(huì)使用JTA?打開(kāi)Hibernate配置文件,如圖16所示,看看是不是Hibernate Synchronizer在其中加入了可疑的內(nèi)容??戳伺渲梦募螅梢源_定,有一些行看起來(lái)是罪魁禍?zhǔn)祝?br>
一旦把那些行變成注釋后,再次運(yùn)行程序。這次,也就是第三次運(yùn)行成功。我在自己計(jì)算機(jī)上運(yùn)行沒(méi)有一點(diǎn)錯(cuò)誤,數(shù)據(jù)已經(jīng)保存到數(shù)據(jù)庫(kù)中。運(yùn)行 ant db 這個(gè)target(在Developer‘s Notebook一書(shū)的第一章有相應(yīng)的解釋?zhuān)┛梢园驯碇兴械臄?shù)據(jù)顯示出來(lái)(不可否認(rèn),這也許有點(diǎn)簡(jiǎn)單),如圖20中所示。如果你跟著這篇文章中順序來(lái)做的,而不是跟著書(shū)中步驟一步一步來(lái)的,你需要先運(yùn)行ant schema來(lái)創(chuàng)建數(shù)據(jù)庫(kù)中的表,或是刪除以前試驗(yàn)留下的數(shù)據(jù)。
你可以在Eclipse內(nèi)運(yùn)行Ant的target,方法是用右鍵單擊包資源瀏覽器(Package Explorer)中的build.xml 文件,選擇菜單中的運(yùn)行Ant(Run Ant),然后在彈出對(duì)話(huà)框中選擇你要運(yùn)行的target,如圖21所示。這個(gè)功能很cool。
查詢(xún)數(shù)據(jù)相當(dāng)簡(jiǎn)單、直白,即使Hibernate Synchronizer產(chǎn)生了很多輔助方法來(lái)使用指定查詢(xún),我認(rèn)為這些沒(méi)有什么用處,都是運(yùn)行查詢(xún),然后返回包含結(jié)果的列表,而不是返回一個(gè)Query對(duì)象,讓你直接使用該對(duì)象。這使你不能使用任何Query提供的、方便的、類(lèi)型安全(type-safe)的參數(shù)設(shè)置方法,因?yàn)檫@個(gè),我打算讓_RootDAO對(duì)象提供一個(gè)Session對(duì)象,可以用“老式”的方法來(lái)使用Hibernate。公平來(lái)說(shuō),我認(rèn)為如果編輯Hibernate Synchronizer 用來(lái)生成代碼所使用的模板,就可以生成想要的任何方法,如果有一個(gè)項(xiàng)目,要用到該插件,可以肯定我會(huì)試著這么做。 實(shí)際上,進(jìn)一步考慮,當(dāng)你得到一個(gè)活動(dòng)的Session時(shí),你只能使用Query,而這些DAO對(duì)象已經(jīng)提供為相應(yīng)功能最佳的實(shí)現(xiàn)。如果你和我在例子中使用查詢(xún)的方法一樣,那就需要你自己來(lái)實(shí)現(xiàn)session管理。你能夠把session管理內(nèi)嵌于你自己所寫(xiě)的那一半DAO中,這樣可以給你提供兩方面的好處。(譯者注:和有base的java POJO對(duì)象一樣,對(duì)于DAO,該插件也生成一對(duì)類(lèi),一個(gè)base DAO給該插件用,一個(gè)是繼承該base DAO的自定義DAO,你可以在其中添加商業(yè)邏輯)。這也是Hibernate Synchronizer把類(lèi)分隔開(kāi)來(lái)如此有用的另一個(gè)原因。對(duì)該插件的遠(yuǎn)見(jiàn)在下邊做了一點(diǎn)研究 不管怎么說(shuō),下邊是我第一次使用的代碼,和書(shū)中48-49頁(yè)上的代碼功能基本一致:
TrackDAO為我們提供了一個(gè)很好的功能:靜態(tài)常數(shù),使用這個(gè)功能,可以用來(lái)進(jìn)行指定查詢(xún)(named query),這就消除了由于輸入問(wèn)題而導(dǎo)致運(yùn)行時(shí)錯(cuò)誤的任何機(jī)會(huì)。我欣賞這個(gè)功能。為該測(cè)試類(lèi)設(shè)定運(yùn)行配置,然后運(yùn)行,輸出結(jié)果正和我想的一樣,如圖22所示。
如上所述,這個(gè)類(lèi)運(yùn)行后,借助于Hibernate Synchronizer提供的模型,我想到有一個(gè)更好的方法可以實(shí)現(xiàn)這個(gè)功能。把查詢(xún)放到TrackDAO中去,這里才是查詢(xún)方法真正屬于的地方,指定查詢(xún)(named query)是和該DAO關(guān)聯(lián)的映射文件的一個(gè)功能。
以上代碼,看起來(lái)更好(nice)、更為清晰(clean),QueryTest3中的main()方法更是得到了大大簡(jiǎn)化
很清楚,這是在Hibernate Synchronizer中用到指定查詢(xún)(named query)時(shí)所應(yīng)采取的方法。很快測(cè)試一下就可以證實(shí)以上的代碼輸出同樣的結(jié)果,而且這里的代碼更好。 編輯映射文件
Hibernate Synchronizer一個(gè)主要 引人之處是為映射文件提供的有專(zhuān)業(yè)水平的編輯器,你可以配置該編輯器,這樣當(dāng)你保存文件的時(shí)候,可以自動(dòng)重新生成相應(yīng)的數(shù)據(jù)對(duì)象,.這只是你最后才會(huì)用到的功能。即使不使用該插件的代碼生成器,可能你還是會(huì)用這個(gè)編輯器。當(dāng)你編輯影射文檔時(shí),它可以為映射文檔中的元素提供智能完成功能,還有一個(gè)你可以操作的映射文檔的大綱視圖。 如果你從Developer‘s Notebook下載的源代碼,然后想用該插件的映射文檔編輯器來(lái)編輯該文件,需要耍一個(gè)小花招。在下載文件中,影射文檔的擴(kuò)展名是".hbm.xml",而該插件僅僅對(duì)以"hbm"為擴(kuò)展名的文件才調(diào)用影射文檔編輯器。理論上,你可以在Eclipse中配置擴(kuò)展名映射,以便兩個(gè)擴(kuò)展名都可以用該插件的編輯器,不過(guò),我沒(méi)有成功過(guò),我在支持論壇上看到別人有同樣的問(wèn)題。因此,暫時(shí)來(lái)看,最好的辦法就是重命名文件(如果用Ant來(lái)生成代碼,確保修改build.xml文件的codegen這個(gè)target,使其也使用新擴(kuò)展名)。 當(dāng)我把Track.hbm.xml改名為T(mén)rack.hbm時(shí),包資源瀏覽器中該文件的圖標(biāo)更新為象Hibernate的logo。該文件的默認(rèn)編輯器變?yōu)樵摬寮挠吧湮臋n編輯器,如圖23中所示。不知道什么原因,對(duì)這兩個(gè)擴(kuò)展名的文件,其它的Hibernate Synchronizer選項(xiàng)都可用,令人奇怪的是,只有“hbm”結(jié)尾的文件可以用其編輯器。
編輯器對(duì)于你要在影射文檔中增加的所有元素提供了上下文敏感的自動(dòng)完成功能,圖24舉了兩個(gè)例子。雖然如此,沒(méi)有一個(gè)屏幕抓圖能夠真正顯示如此功能的細(xì)節(jié)和有用之處。我鼓勵(lì)你自己安裝該插件,然后自己來(lái)試試這個(gè)編輯器.你很快就會(huì)發(fā)現(xiàn)當(dāng)使用影射文檔的時(shí)候,這個(gè)編輯器是多么有幫助。
大綱視圖,象圖26中所示,可以用圖形的方式顯示類(lèi)的結(jié)構(gòu),被影射的元素,指定查詢(xún)和其它一些出現(xiàn)在影射文檔中內(nèi)容,同時(shí)也提供了幾個(gè)向?qū)?,幫助你?chuàng)建新項(xiàng)
編輯器內(nèi)的上下文菜單中有一項(xiàng)是Format Source Code,你可以用來(lái)對(duì)文檔進(jìn)行清潔和改變文檔結(jié)構(gòu)。編輯器內(nèi)也有很多靈巧和有用的功能,看看它如何“成長(zhǎng)”是一件有趣的事情。對(duì)我來(lái)說(shuō),唯一的不滿(mǎn)是當(dāng)你完成XML屬性的時(shí)候,該編輯器用非常不同于JDT在java代碼中使用的方法來(lái)幫助你管理引號(hào),在它們之間切換有時(shí)令人迷失(JDT采用的方法可能只適于它自己,但一旦你信任它,這個(gè)方法看起來(lái)就有點(diǎn)魔力) 產(chǎn)生數(shù)據(jù)庫(kù)中的表
和我的第一印象-一切都可以通過(guò)影射文檔得到-不同,Hibernate Synchronizer現(xiàn)在沒(méi)有為創(chuàng)建或更新數(shù)據(jù)庫(kù)提供任何支持。支持論壇上已經(jīng)張貼了一個(gè)這樣的功能要求,如果我們將來(lái)看到這些功能,我不會(huì)感到驚奇。這種功能應(yīng)該不是很難。暫時(shí),你不得不采用其他方法,如果你想從影射文檔生成數(shù)據(jù)庫(kù),你可以象Hibernate: A Developer‘s Notebook 一書(shū)中使用Ant一樣來(lái)做到。下邊描述的Hibernator插件支持在Eclipse中更新數(shù)據(jù)庫(kù)?;蛟S,我應(yīng)該研究一下是否能夠同時(shí)安裝這兩個(gè)插件。 好了,我當(dāng)然希望這個(gè)簡(jiǎn)單介紹的指南能夠讓你對(duì)這個(gè)插件的功能有一個(gè)大致的了解,當(dāng)然,我沒(méi)有提及它的所有功能。如果文中有些內(nèi)容激起了你的興趣,那就下載,安裝,自己試試。 Trade-Offs 很清楚,你可以用Hibernate Synchronizer來(lái)做靈巧的事情。我會(huì)在我自己的Hibernate項(xiàng)目中使用該插件嗎?這個(gè)想法有其它一些優(yōu)缺點(diǎn)需要考慮,可能現(xiàn)在還不是做決定的時(shí)候,直到需要用Hibernate來(lái)取代自家釀(當(dāng)然非常簡(jiǎn)單)的、已經(jīng)在工作的輕量級(jí)O/R工具時(shí)才能做出決定。這是個(gè)足夠重要的改變,我們一直推遲做出決定,直到有其它原因出現(xiàn)。下邊的因素在我的決定中占有重要分量。 在安裝部分已經(jīng)提及,有幾個(gè)涉及到許可證的問(wèn)題,該插件的論壇對(duì)這個(gè)也有些討論?,F(xiàn)在所采用的許可證是作了適合自己的修改后的GNU GPL,刪除了關(guān)于源代碼共享的規(guī)定,保留了"copyleft"保護(hù)的其它方面。關(guān)于這個(gè)的合法性有些問(wèn)題,作者正在找另外一個(gè)可用來(lái)替代的許可證。它的確切意圖是保護(hù)該插件,不妨礙使用該插件生成代碼的其它一些項(xiàng)目。不過(guò)還是值得仔細(xì)讀一下現(xiàn)在的許可證,看看你是否相信該許可證已經(jīng)達(dá)到其本來(lái)意圖。否則,對(duì)你來(lái)說(shuō),會(huì)有很多風(fēng)險(xiǎn) 同樣的討論顯示,作者本來(lái)想把該插件作為開(kāi)源軟件,但臨時(shí)改變了主意,因?yàn)樗X(jué)得該插件還沒(méi)有“琢磨”到足夠給其他人以作為一個(gè)優(yōu)秀的開(kāi)源軟件的程度。此后,他通過(guò)電子郵件和一些性急的人進(jìn)行了交流,這些人的電子郵件非常討厭,最終使他沒(méi)有興趣再分享整個(gè)源代碼,真是令人感到悲哀。當(dāng)然,和我們分享什么是他的權(quán)力。對(duì)于世界來(lái)說(shuō),這個(gè)插件是個(gè)禮物,作者不欠我們什么。但我希望其它用戶(hù)的積極影響或許可以幫助說(shuō)服他重新實(shí)行原來(lái)的計(jì)劃-分享源代碼。我真正重視可以得到源代碼的工具,不僅是因?yàn)檫@是個(gè)很好的學(xué)習(xí)機(jī)會(huì),而且意味著有了源代碼,如果有需要,我(或其他人)可以馬上修改出現(xiàn)的一些小問(wèn)題。到目前為止,該插件的作者一直非常積極的回應(yīng)用戶(hù)的問(wèn)題,但是沒(méi)有人能夠一個(gè)人做的象一個(gè)團(tuán)隊(duì)一樣好,我們有些時(shí)候很忙,筋疲力盡,或是心情煩亂 Hibernate Synchronizer用它自己的模版和一套機(jī)制來(lái)生成你的數(shù)據(jù)訪(fǎng)問(wèn)類(lèi),這個(gè)事情有好的一面,也有壞的一面。好的一面在于它為你提供了比標(biāo)準(zhǔn)的Hibernate代碼生成工具更多的功能。在自動(dòng)產(chǎn)生的你所定義的數(shù)據(jù)對(duì)象的子類(lèi)中嵌入商業(yè)邏輯,而不用害怕重新生成代碼的時(shí)候有關(guān)商業(yè)邏輯的代碼被覆蓋,這是一個(gè)很大的額外好處。該插件生成的、使許多簡(jiǎn)單的類(lèi)更簡(jiǎn)單的類(lèi)提供了其它一些優(yōu)秀的功能。 另一方面,這并不意味著當(dāng)這個(gè)平臺(tái)添加新功能或是有其它一些變化的時(shí)候,Hibernate Synchronizer生成的代碼會(huì)滯后。這個(gè)插件的代碼也很有可能在支持Hibernate很少用到的方式方面存在一些bug,因?yàn)槭褂迷摬寮挠脩?hù)群很小,僅有一個(gè)人對(duì)其進(jìn)行更新,你可以從論壇中看到這種現(xiàn)象的證據(jù)。 和許多事情一樣,由你決定是否潛在好處勝過(guò)風(fēng)險(xiǎn)。即使你沒(méi)有使用代碼生成器,或許你會(huì)發(fā)現(xiàn)影射文檔編輯器極端有用。如果你只是使用編輯器的自動(dòng)完成和協(xié)助功能,你可以關(guān)閉automatic synchronization。 如果你真的采用了這個(gè)插件,而且發(fā)現(xiàn)它很有用,毫無(wú)疑問(wèn),我鼓勵(lì)你和作者聯(lián)系,表達(dá)你的謝意,如果可能,可以考慮捐些錢(qián)以支持該插件繼續(xù)開(kāi)發(fā)。 其它一些插件 在我搜尋插件的過(guò)程中,我發(fā)現(xiàn)了其它兩個(gè)插件,可以為在Eclipse中使用Hibernate提供支持(如果你知道其它一些插件,或是在將來(lái)的某一天偶遇其它的插件,我很有興趣了解這些插件)。也許將來(lái)我會(huì)寫(xiě)一些關(guān)于這些插件的文章。 HiberClipse HiberClipse看起來(lái)是另一個(gè)非常有用的工具,該插件采取的是數(shù)據(jù)庫(kù)驅(qū)動(dòng)的工作流方法:你已經(jīng)有了數(shù)據(jù)庫(kù),想用該插件構(gòu)造Hibernate映射文件和Java類(lèi)文件。這種事很常見(jiàn),如果你面對(duì)這樣的任務(wù),我肯定會(huì)推薦你使用該插件。該插件提供了一個(gè)很cool的功能 :在Eclipse中提供給你一個(gè)正在使用的數(shù)據(jù)庫(kù)的圖形化顯示的“關(guān)系視圖”(應(yīng)該指出,當(dāng)你從一個(gè)現(xiàn)存的數(shù)據(jù)庫(kù)開(kāi)始工作時(shí)候,Hibernate Synchronizer也沒(méi)有使你處于孤立無(wú)援的境地,New Mapping File Wizard 可以連接數(shù)據(jù)庫(kù),然后根據(jù)它找到的內(nèi)容生成映射文件,如圖28所示)
Hibernator 最后,Hibernator看起來(lái)向另一個(gè)方向傾斜,從你的Java代碼來(lái)產(chǎn)生簡(jiǎn)單的Hibernate映射文檔,然后可以由此創(chuàng)建(或是更新)數(shù)據(jù)庫(kù)。另外,還提供了在Eclipse中進(jìn)行數(shù)據(jù)庫(kù)查詢(xún)的能力。在這三個(gè)插件中,它處于開(kāi)發(fā)的最早期,但是已經(jīng)值得你時(shí)常關(guān)注,特別是該插件援引Hibernate開(kāi)發(fā)小組的成員作為貢獻(xiàn)者。 了解更多 如果這篇文章激起了你的興趣,有很多資源可以讓你深入了解那些主題,除了文中所連接的站點(diǎn)以外,有一些也許你會(huì)感興趣。當(dāng)然,包括我自己的書(shū)Hibernate: A Developer‘s Notebook。對(duì)于更有深度的參考資料,在線(xiàn)文檔非常有幫助,特別是其中的參考手冊(cè),還有一本Hibernate開(kāi)發(fā)人員自己寫(xiě)的Hibernate in Action即將發(fā)行,我自己也很期待讀這本書(shū)。 |
|