最近,我開始使用Eclipse作為我的開發環境。這部分是由於它支援我開發時所使用的許多平台,部分是由於Eclipse是開放的可擴充環境的傑出代表,大家都可以為它的發展貢獻自己的力量。我正開始調查人們已經提出的一些擴充。例如,我使用了一個叫做XMLBuddy的小外掛程式來處理XML檔案,它很有用。所以,我開始好奇是否有人已經編寫了使用Hibernate的外掛程式,最近在編寫Developer's Notebook一書時,我做了大量這方面的工作。結果我瞭解到,這方面確實有一些工作進行中,本文將探討其中之一——Hibernate Synchronizer。
Hibernate Synchronizer
迄今為止,在我找到的外掛程式中,Hibernate Synchronizer最令我感興趣,因為看起來它對以映射為中心的工作流程提供了最好的支援,而我的Developer's Notebook一書中就採用了這種工作流程。(Hibernate可以用於多種用途,所以請查看可用的其他外掛程式,如果您的環境需要其他方法,這些外掛程式將更有協助。)事實上,Hibernate Synchronizer外掛程式讓您在修改映射文檔時,無需考慮更新Java代碼,它會在您進行編輯的時候以一種非常類似於Eclipse的方式自動更新Java代碼。通過為每個被映射的對象建立一對類,它比Hibernate的內建代碼產生工具更為先進。它“擁有”一個基類,當您修改映射時,它可以隨意重寫這個基類。它還提供一個擴充了這個基類的子類,可以在這個子類中加入商務邏輯和其他代碼,而無需擔心它會在您眼皮底下消失。
因為要適用於以Hibernate映射以文件為主的方法,Hibernate Synchronizer還包括一個用於Eclipse的新編輯器組件,為此類文檔提供智能輔助和代碼自動完成功能。優秀的DTD驅動的XML編輯器(比如前面提到過的XMLBuddy)可以實現其中的一些功能,但是Hibernate Synchronizer利用對文檔語義的理解做得更好。它還提供了一個映射中的屬性和關係的圖形化視圖、建立新元素的“嚮導”介面,以及其他類似的優點。而且如前所述,在其預設配置中,編輯器會在使用者編輯映射文檔時自動重建資料訪問類。
Hibernate Synchronizer還有其他的功能。它在Eclipse的New菜單中加入了一個地區,為建立Hibernate配置和對應檔提供嚮導,並在包的資源管理員和其他適當的位置中添加了操作功能表項目,使使用者可以輕鬆訪問相關的Hibernate操作。
好了,現在已經有了足夠多的抽象描述,是時候開始實踐了!畢竟,您很可能對此產生了興趣,要不您就不會閱讀本文。那麼,如何安裝與使用Hibernate Synchronizer呢?
安裝
可以使用Eclipse的內建Update Manager安裝Hibernate Synchronizer。該外掛程式為Eclipse 2.1和即將發布的Eclipse 3的使用者提供獨立的更新網站。因為我把Eclipse用於任務關鍵型的工作,所以我使用的仍然是生產版本,即2.1。在我撰寫本文時,Eclipse 3已經進入了“發布候選(release candidate)”階段。今年夏末,當我從JavaOne會議回來的時候,我非常希望能夠升級到生產版本3。(我提及這一點的主要原因是強調下面的指導是基於Eclipse 2而編寫的;在Eclipse 3中,某些命令和介面無疑會有所不同,所以如果您準備使用它,確保在遵照這些步驟的同時還要加入自己的判斷!我的印象是Hibernate Synchronizer自己的
安裝指導是針對Eclipse 3編寫的,也許這對您會有所協助。)
啟動Eclipse,選擇Help -> Software Updates -> Update Manager,便可以開啟Update Manager。Install/Update透視圖開啟之後,在Feature Updates視圖中右擊(或者控制項單擊(control-click),如果您使用的是單按鈕滑鼠),選擇New -> Site Bookmark,如圖1所示。
圖1. 向Update Manager添加Hibernate Synchronizer外掛程式網站
在出現的對話方塊中,輸入所需外掛程式版本的URL。輸入的URL取決於您的Eclipse版本:
- Eclipse 2.1: http://www.binamics.com/hibernatesync/eclipse2.1
- Eclipse 3: http://www.binamics.com/hibernatesync
還需為新的書籤指定一個名稱,“Hibernate Synchronizer”就很好。圖2顯示的對話方塊包括了我的Eclipse 2.1.2環境中的所有必需資訊。
圖2. Hibernate Synchronizer外掛程式更新網站的書籤
單擊Finish之後,新的書籤將出現在Feature Updates視圖中,如圖3所示。
圖3. Hibernate Synchronizer網站現在可用了
為了實際安裝外掛程式,單擊書籤左側的三角形展開符號,然後單擊其中的下一個三角形展開符號,重複這個過程,直到出現外掛程式的表徵圖為止。單擊該表徵圖,Preview視圖就會更新,從而顯示一個允許安裝外掛程式的介面,如圖4所示。
圖4. 準備安裝外掛程式
單擊Install Now,實際安裝外掛程式,讓Eclipse引領您完成整個過程(圖5-10)。
圖5.安裝Hibernate Synchronizer
圖6. 外掛程式許可證協議
可參見下面的權衡部分,其中有關於許可證協議的一些討論。在決定在自己的項目中使用Hibernate Synchronizer之前,您可能想仔細閱讀一下它。我認為這是很好的做法,但是令人困惑的是,它基於GPL,實際上並非是開源的。
圖7. 選擇安裝外掛程式的位置,使用預設的就可以
圖8.對沒有簽名的外掛程式發出的標準警告
圖9.正在安裝
圖10.安裝完畢
現在外掛程式已經安裝完畢,需要退出並重新運行Eclipse,以便使其生效。出現的對話方塊似乎暗示Eclipse將自動重啟,但是根據我的經驗,單擊Yes只會退出環境,必須手動重啟。這可能是Eclipse 2.1的Mac OS X實現的一個局限性;Eclipse 3將成為首個承諾對OS X提供一流支援的版本。不管怎麼說,這是一個小問題。如果需要重啟Eclipse,現在就重啟吧,因為應該開始配置外掛程式了!
配置
Eclipse重新啟動之後,可以關閉Install/Update透視圖。開啟一個使用Hibernate的Java項目。如果您讀過Developer's Notebook一書中的例子,那麼有幾個目錄可供選擇。我將選用第3章中的例子,因為這一章是可以線上閱讀的樣章。您還可以從該書的網站下載所有例子的原始碼。
如果您準備建立一個新的Eclipse項目,以便使用樣本原始碼目錄中的一個,只需選擇File -> New -> Project。選擇建立一個Java項目,然後單擊Next,為其命名(我使用的是“Hibernate Ch3”,如圖11所示),取消對Use default複選框的選擇,以便可以告訴Eclipse現有項目目錄的位置,然後單擊Browse按鈕,定位它在磁碟機上的具體位置。現在可以單擊Finish,建立該項目,但是我一般喜歡單擊Next,然後再次檢查Eclipse的選擇。(當然,如果有什麼出錯,您始終可以返回並修改項目屬性,但是我發現,如果存在庫丟失之類的錯誤,馬上就會面對大量的錯誤和警告,這實在是一件麻煩的事情。)
圖11. 建立一個使用Hibernate的新項目
此處我的警告是多餘的。Eclipse清楚目錄的架構及用法,還找出了我曾下載和安裝過的所有第三方庫,以便讓Hibernate和HSQLDB資料庫引擎能夠運行。這種智能適應性是Eclipse的重要特性之一。圖12顯示我們的新項目已經開啟並準備好用於實驗了。它還顯示,Eclipse不喜歡把視窗縮到足夠小以適應適當的螢幕快照。從現在起,我只能捕捉視窗的一部分。
圖12. 第3章中的樣本項目
接下來要建立一個Hibernate Synchronizer可以使用的Hibernate設定檔。src目錄中已經存在一個hibernate.properties檔案,它說明了書中例子的配置,但是Hibernate Synchronizer只能使用Hibernate的基於XML的配置方法。所以,我們需要把hibernate.properties檔案的內容複寫到一個新的hibernate.cfg.xml檔案中去。從好的方面來說,這使我們可以見識Hibernate Synchronizer的一項特性,即設定檔嚮導。選擇File -> New -> Other,單擊新可用的Hibernate類別,選中Hibernate Configuration File,然後單擊Next。
圖13. 啟動Hibernate Configuration File嚮導
當嚮導啟動後,它所提供的用於放置檔案的目錄取決於當前在Eclipse中選中的檔案。出於一致性方面的考慮,一定要把它和properties版本一起放在頂級的src目錄中。填入嚮導所需的其餘資訊,匹配配置的properties版本,如圖14所示。注意,與使用Ant控制Hibernate的執行(這是Developer's Notebook一書中所使用的方法)不同,當調用Hibernate時,我們無法控制當前的工作目錄,所以需要在URL中使用一條到資料庫檔案的完全限定路徑。我使用的值是(有點難看):jdbc:hsqldb:/Users/jim/Documents/Work/OReilly/Hibernate/Examples/ch03/data/music。(如果有人能告訴我如何讓Eclipse或Hibernate Synchironizer對一個項目使用特定的工作目錄,我肯定會高度興趣。我在Eclipse方面還是一個新手,所以如果知道這種情況是可能的,只是我不知道如何去做,我肯定不會感到吃驚。)
圖14. 填寫設定檔的詳細資料
填寫Driver Class時有一點奇怪:需要單擊Browse按鈕,並開始輸入驅動程式的類名。如果輸入“jdbcD”,視窗將只會給出兩個選擇,很容易就可以找出正確的選擇,如圖15所示。
圖15. 指定HSQLDB驅動程式類
按照圖14所示設定適用於您自己的安裝的值之後,就可以單擊Finish來建立設定檔。Hibernate Synchronizer現在已經可以使用了。它開啟了建立的檔案,所以可以看到一個Hibernate的XML設定檔的結構和詳細資料。
圖16. 產生的設定檔
一種快速測試該配置是否生效的方式是使用其他的嚮導介面。選擇File -> New -> Other,單擊新可用的Hibernate類別,選中Hibernate Mapping File,然後單擊Next。當嚮導出現時,它應該填充了剛才輸入的所有設定資訊,可以單擊Refresh按鈕來確定它可以與資料庫通訊,它還會顯示找到了一個TRACK表。第一次這樣做的時候,由於某種原因,您可能必須確認包含HSQLDB驅動程式的.jar檔案的位置,但是這種情況只會發生一次。不管怎樣,確認了一切正常之後,單擊Cancel,而不是實際建立映射,因為我們想使用手動建立的已有對應檔。
產生代碼
這很可能是您一直期待的部分。我們可以做些什麼特別的呢?馬上就有一個可用於Hibernate映射文檔的新操作功能表項目。
如果右擊(或控制單擊)任意一項,將會看到很多與Hibernate相關的選項(圖17),其中包括一個同步選項。這是一種手動讓Hibernate Synchronizer產生與映射文檔相關的Data Access Objects的方式。
圖17.映射文檔的同步選項
Add Mapping Reference選項也很有用:它在主Hibernate設定檔中添加了一項,告知有關該映射文檔的資訊,所以無需在原始碼中加入任何內容來要求配置相應的映射。現在我們來看看選擇Synchronize Files的結果。
到這裡事情開始變得有趣了。出現了兩個新的子包,一個用於Hibernate Synchronizer“擁有的”“基”資料訪問對象,可以在任何時候進行改寫,而另一個用於為這些DAO產生子類的業務對象,它不會被重寫,這為我們提供了一個向資料類添加商務邏輯的機會(如圖18所示)。
圖18. 經過同步的資料訪問對象,顯示了可編輯的子類
這樣產生的類比使用常規的Hibernate代碼產生工具產生的類要多很多,這有一些優點以及一些潛在的缺點,在稍後的權衡部分中我們將討論這些。還要注意,可以在項目的屬性配置中選擇產生其中的哪些類,以及產生它們的包結構。我本來應該示範一下的,但是當前的外掛程式版本有一個bug,它阻止了在Mac OS X上對這個配置介面進行訪問。補丁已經開發出來了,但尚未發布。
基於Hibernate Synchronizer頁面上的例子與下面的類,我試圖使用這些新的Data Access Objects插入一些資料到音樂資料庫中。這十分類似於使用標準Hibernate代碼產生器的版本(在Hibernate: A Developer's Notebook一書的39-40頁),甚至更為簡單,因為Hibernate Synchronizer產生的類針對每項資料庫操作都建立並提交了一個新事務,所以在像這樣簡單的場境中,您不需要編寫代碼來設定事務。(當然了,要讓一組操作作為單個事務運行,有很多種方法。)下面是新版本的代碼:
package com.oreilly.hh;import java.sql.Time;import java.util.Date;import net.sf.hibernate.HibernateException;import com.oreilly.hh.dao.TrackDAO;import com.oreilly.hh.dao._RootDAO;/** * Try creating some data using the Hibernate Synchronizer approach. */public class CreateTest2 { public static void main(String[] args) throws HibernateException { // Load the configuration file _RootDAO.initialize(); // Create some sample data TrackDAO dao = new TrackDAO(); Track track = new Track("Russian Trance", "vol2/album610/track02.mp3", Time.valueOf("00:03:30"), new Date(), (short)0); dao.save(track); track = new Track("Video Killed the Radio Star", "vol2/album611/track12.mp3", Time.valueOf("00:03:49"), new Date(), (short)0); dao.save(track); // We don't even need a track variable, of course: dao.save(new Track("Gravity's Angel", "/vol2/album175/track03.mp3", Time.valueOf("00:06:06"), new Date(), (short)0)); }}
當我編寫這些代碼時,可以使用Eclipse是一件十分愜意的事情。我已經忘了當我為書籍編寫例子時,我多麼希望可以使用智能程式碼完成功能,而且JDT在其他方面也同樣能幫上忙。
為了在Eclipse中運行這個簡單的程式,我們需要設定一個新的Run配置。選擇Run -> Run...,把CreateTest2.java作為當前的活動編輯器檔案。單擊New,Eclipse就會知道我們想要在當前項目中運行這個類,因為我們使用main()方法建立它。它指定的預設名稱是CreateTest2。介面應該如圖19所示。單擊Run,試著建立一些資料。
圖19.準備好在Eclipse中運行我們的建立測試
如果您確實遵照了這些步驟,您就會發現執行時首次嘗試將會失敗:Hibernate抱怨說設定檔沒有包含映射引用,而按要求至少要有一個。啊哈!所以,這就是圖16底部XMLBuddy出現黃色底線警告的原因。我們可以很容易地解決這個問題,具體方法是在Package Explorer視圖中的Track.hbm.xml映射文檔上右擊,然後在新的Hibernate Synchronizer子功能表中選擇Add Mapping Reference。這對XMLBuddy來說是正確的做法,可以讓運行繼續。遺憾的是,運行沒有繼續多久。下一個錯誤是無法在JNDI中找到JTA UserTransaction初始上下文。顯然我並非惟一遇到這種問題的人,在一個論壇主題中相關的討論如火如荼,但是還沒有人找到解決方案。
因為知道我不需要使用JTA,所以我想知道為什麼Hibernate要嘗試找到JTA。我開啟了Hibernate設定檔(圖16),然後尋找Hibernate Synchronizer中的任何可疑之處。無疑有幾行是最有嫌疑的:
<property name="hibernate.transaction.factory_class"> net.sf.hibernate.transaction.JTATransactionFactory </property> <property name="jta.UserTransaction"> java:comp/UserTransaction </property>
我試著把上述內容注釋掉並再次運行,這第三次運行成功了。運行沒有出現錯誤,我的資料出現在資料庫中。哇!運行可以信賴的antdb目標(Developer's Notebook一書的第1章中對此有說明)便可以看到所有資料(確實很簡單),如圖20所示。如果您要這樣做,要確保從一個antschema開始建立資料庫模式,或者清空來自前面實驗中的任何測試資料。
圖20.測試程式所建立的資料
注意,可以在Eclipse中運行Ant目標,具體方法是右擊(或控制單擊)Package Explorer中的build.xml檔案,選擇Run An,然後使用Eclipse對話方塊選擇目標。酷吧?
圖21.在Eclipse中運行Ant
使用查詢取回資料相當簡單,儘管這次的代碼很接近於常規的使用Hibernate產生的普通資料訪問類所使用的代碼。即使Hibernate Synchronizer為處理指定查詢產生了大量協助器方法,我還是認為它們中間沒有哪一個方法特別有用,因為它們都堅持執行查詢後返回結果清單,而不是提供可以直接使用的Query對象。這使您無法使用Query的方便的型別安全的參數設定方法。因為這一點,我決定一定要讓RootDAO對象為我提供一個Hibernate Session,以便使用老式的方法。我認為我可以編輯Hibernate Synchronizer使用的任何模板來產生我想要的任何方法,如果我要使用它來開發一個項目,我幾乎肯定我會這麼做。
實際上,進一步考慮的話,因為當獲得一個活動的Session時,您只能處理Query,DAO所提供的方法已經達到了最佳效果。如果您想像我在這個例子中所做的那樣處理查詢,您必須總是自己進行會話管理。可以把會話管理嵌入到“您自己的”那一半DAO所提供的商務邏輯中,這就可以同時利用兩方面的好處了。這正是Hibernate Synchronizer提供的拆分類模型如此有用的另一個原因。我將在下面對此進行深入探討。
不管怎樣,下面是我第一次想出的代碼,基本上等同於書中48-49頁上給出的代碼:
package com.oreilly.hh;import java.sql.Time;import java.util.ListIterator;import net.sf.hibernate.HibernateException;import net.sf.hibernate.Query;import net.sf.hibernate.Session;import com.oreilly.hh.dao.TrackDAO;import com.oreilly.hh.dao._RootDAO;/** * Use Hibernate Synchronizer's DAOs to run a query */public class QueryTest3 { public static void main(String[] args) throws HibernateException { // Load the configuration file and get a session _RootDAO.initialize(); Session session = _RootDAO.createSession(); try { // Print the tracks that will fit in five minutes Query query = session.getNamedQuery( TrackDAO.QUERY_COM_OREILLY_HH_TRACKS_NO_LONGER_THAN); query.setTime("length", Time.valueOf("00:05:00")); for (ListIterator iter = query.list().listIterator() ; iter.hasNext() ; ) { Track aTrack = (Track)iter.next(); System.out.println("Track: \"" + aTrack.getTitle() + "\", " + aTrack.getPlayTime()); } } finally { // No matter what, close the session session.close(); } }}
TrackDAO提供的一個優秀特性是靜態常量,通過它,我們可以請求指定查詢,消除任何由於字串輸入錯誤而引起執行階段錯誤的可能性。我喜歡這一點!為這個測試類別設定和執行Run配置,將會產生預期的輸出,如圖22所示。
圖22. Eclipse控制台視圖中的查詢結果
我前面提到過,運行這個類之後,我意識到,藉助於Hibernate Synchronizer所提供的模型,可以用一種更好的方法來實現它。因為指定查詢是與該資料訪問對象相關的對應檔的一項特性,所以如果我們將查詢放入TrackDAO對象中(這才是它真正屬於的地方),那麼這個對象看起來應該是下面這個樣子:
package com.oreilly.hh.dao;import java.sql.Time;import java.util.List;import net.sf.hibernate.HibernateException;import net.sf.hibernate.Query;import net.sf.hibernate.Session;import com.oreilly.hh.base.BaseTrackDAO;/** * This class has been automatically generated by Hibernate Synchronizer. * For more information or documentation, visit The Hibernate Synchronizer page * at http://www.binamics.com/hibernatesync or contact Joe Hudson at joe@binamics.com. * * This is the object class that relates to the TRACK table. * Any customizations belong here. */public class TrackDAO extends BaseTrackDAO { // Return the tracks that fit within a particular length of time public static List getTracksNoLongerThan(Time time) throws HibernateException { Session session = _RootDAO.createSession(); try { // Print the tracks that will fit in five minutes Query query = session.getNamedQuery( QUERY_COM_OREILLY_HH_TRACKS_NO_LONGER_THAN); query.setTime("length", time); return query.list(); } finally { // No matter what, close the session session.close(); } }}
這樣做更好更清晰,還進一步簡化了QueryTest3中的main()方法:
public static void main(String[] args) throws HibernateException { // Load the configuration file and get a session _RootDAO.initialize(); // Print the tracks that fit in five minutes List tracks = TrackDAO.getTracksNoLongerThan(Time.valueOf("00:05:00")); for (ListIterator iter = tracks.listIterator() ; iter.hasNext() ; ) { Track aTrack = (Track)iter.next(); System.out.println("Track: \"" + aTrack.getTitle() + "\", " + aTrack.getPlayTime()); } }
顯然,這是一種在使用Hibernate Synchronizer時處理指定查詢的方法。做一次快速測試就可以確認它產生同樣的輸出,而且它的代碼也要好很多。
您是否想使用Hibernate Synchronizer來產生它自己的Data Access Objects類型暫且放下,我們還有最後一項重要特性要探討。
編輯映射
Hibernate Synchronizer的一個主要吸引力就在於它為映射文檔提供的專業化的編輯器。可以配置這個編輯器,以便只要儲存檔案就自動重建相關資料對象,但是這隻是一個錦上添花的功能;即使不打算使用該外掛程式的代碼產生器,您也可能希望使用這個編輯器。它為您提供映射文件項目的智能完成功能,以及一個圖形化的大綱視圖,可以在這個視圖中操縱這些元素。
但是,如果從Developer's Notebook一書中的下載原始碼開始,就至少得有一項技巧才可以讓編輯器工作。在下載的檔案中,映射文檔的副檔名為“.hbm.xml”,而只有以“.hbm”結尾的檔案才能調用編輯器。理論上,可以在Eclipse中配置副檔名映射,以便使具有這兩種副檔名的檔案都能使用外掛程式的映射文檔編輯器,但是我無法使其生效,而且我注意到支援論壇上有人面臨著與我相同的問題。所以,至少目前最好的做法就是重新命名檔案。(如果您堅持使用基於Ant的標準代碼產生,請確保更新build.xml中的codegen目標以使用新的副檔名。)
在我把Track.hbm.xml重新命名為Track.hbm之後,它在Package Explorer中的表徵圖就更新為Hibernate徽標,而預設的編輯器則變為外掛程式的編輯器,如圖23所示。由於某種原因,其他的Hibernate Synchronizer選項(如圖17所示)對於其中任意一種副檔名都是可用的,但是編輯器只對較短的版本可用。
圖23. Hibernate映射文檔(副檔名為“.hbm”)的操作功能表
編輯器為映射文檔中添加的所有元素都提供上下文相關的自動完成支援。圖24顯示了一些例子,但是螢幕截圖無法真正捕捉到該特性的深度和有效性。我強烈建議您安裝外掛程式並使用它。您很快就會看到它在處理映射文檔方面是多麼有用。
圖24和25.映射文檔編輯器中的完成協助工具功能
如圖26所示,大綱視圖提供了一個關於類階層、被映射的元素、指定查詢以及映射文檔中的各種元素的圖形化視圖,還提供一個菜單,其中有一些嚮導可以協助建立新的屬性。
圖26和27. 映射編輯器的大綱視圖和“Add property”嚮導
編輯器中的操作功能表還提供一個Format Source Code選項,可以使用它來整理和重新構造文檔。這個編輯器中已經有了很多靈巧和有用的特性,看它們如何發展也是一件有趣的事情。惟一使我感到不滿的是(並不是什麼大問題),當完成XML屬性時,這個編輯器用來協助管理引號的方法與JDT在Java代碼中使用的方法完全不同。在它們之間來回切換會把人弄迷糊。(您需要一些時間適應JDT的工作方式,但是一旦您開始信任它,它就會變得魔力無窮。)
產生資料庫模式
儘管我的第一印象是所有內容都來自映射文檔,但是Hibernate Synchronizer目前不支援從映射文檔建立或更新資料庫模式。支援論壇上已經提出了相關的請求,所以如果將來看到這些特性,我肯定不會吃驚,因為提供這類支援並不很困難。目前來說,如果要從映射文檔開發資料庫,就必須使用像Hibernate: A Developer's Notebook書中這種Ant驅動之類的方法。此外,下面描述的Hibernator外掛程式支援在Eclipse中進行模式更新。我可能要研究一下是否可以同時安裝這兩種外掛程式。
我希望本文能夠讓您清楚地瞭解該外掛程式所提供的功能。無論如何,我沒有涵蓋它的所有功能,所以如果您有興趣,可以去下載它然後自己進行探索。
權衡
毫無疑問,可以使用Hibernate Synchronizer來完成一些靈巧的工作。是否要在我自己的Hibernate項目中使用它呢?這樣做有優點也有缺點,很可能直到實際採用Hibernate來代替我們正在使用的自己開發的(且過分簡單的)輕量級O/R工具時,我才會做出決定。這是一次意義相當重大的改動,而我們把這次改動延遲到了由於其他原因進行架構變換的時候。下面是對我的決定起著重要作用的一些因素。
正如我們在安裝小節中所談到的那樣,在許可證方面還存在著一點問題。外掛程式的論壇中有此方面的討論。當前的許可證基於對GNU GPL的定製修改,這次修改刪除了所有原始碼共用方面的條款,但是試圖保留“copyleft”保護的其他方面。關於這樣做的合法性仍然存在一些問題,而作者正在尋求另一種解決辦法。很清楚,目的是要保護外掛程式,而不是阻止其他任何項目使用該外掛程式產生代碼,但是有必要仔細閱讀當前的許可證,看一看其目的是否已經達到,或者您是否仍然冒著很大的風險。
同一討論表明,作者原來是以開源的形式發布外掛程式的,但是又臨時收回了這一決定,因為他覺得它還不夠完美以用作一個優秀的範例。接著,他與一些莽撞的人通過一些非常不愉快的郵件,這使他不願再共用原始碼。當然,他有權決定是否與我們共用原始碼。該外掛程式對於整個世界來說是一份大禮,而作者並不欠我們什麼。但是我希望他能與其他使用者進行足夠的正面交流,這樣就能堅定他原來共用原始碼的想法。我真的認為能夠看到我使用的工具的原始碼是一件很有價值的事情,不僅因為這是一個很好的學習機會,還因為這意味著,如果需要的話我可以立刻修複一些小問題。作者在解決使用者的問題方面始終很熱心,響應也很快,但是一個人無法維持一個社區,因為我們都有繁忙、筋疲力盡和心煩意亂的時候。
Hibernate Synchronizer使用它自己的模板和機制來產生資料訪問類,這既有優點也有缺點。優點是可以獲得比Hibernate的“標準”代碼產生工具更多的功能。可以使用資料對象的一個自動產生的子類,並在該資料對象中嵌入商務邏輯,而無需擔心重建存取碼時這些商務邏輯會被改寫,這也是一個不錯的特性。外掛程式產生的使很多簡單的情境更簡單的類還提供了其他的優點。
另一方面,這還意味著,當Hibernate平台增加一些新的特性或者做了改動之後,Hibernate Synchronizer產生的程式碼就有些滯後於Hibernate了。在對Hibernate不常使用的模式的支援方面,外掛程式代碼也存在bug:它的使用者群很小,一個人就可以讓它保持更新。您可以在討論論壇上找到這種現象的證據。
和很多事情一樣,潛在的優點是否超過風險要由您來決定。即使不使用代碼產生器,您也會發現映射編輯器非常有用。如果您只想使用編輯器的自動完成和協助工具功能,可以關掉自動同步選項。
如果您使用過該外掛程式,並且發現它很有用,我建議您聯絡其作者,表達您的謝意,並考慮捐出一些資金來協助支援它的未來發展。
其他外掛程式
迄今為止,我還找到了另外兩個也提供Eclipse中的Hibernate支援的外掛程式。(如果您還知道有其他的外掛程式,或者將來遇到了這樣的外掛程式,我很願意知道它們。)或許將來我還會撰寫有關這些外掛程式的文章。
HiberClipse
HiberClipse外掛程式看起來也是一種非常有用的工具。它似乎適用於資料庫驅動的工作流程,在這個工作流程中,已經有了一個資料庫模式,而您想構建一個Hibernate對應檔和Java類來使用該模式。這是一種很常見的情境,如果您發現自己面臨著這樣的難題,我強烈推薦您使用這個外掛程式。它提供了一項非常酷的特性:在Eclipse中為所使用的資料庫提供圖形化的“關係視圖”。(我應該指出,如果您想從一個現有的資料庫模式開始,Hibernate Synchronizer也會有所協助的。它的New Mapping File Wizard可以串連到您的資料庫,並基於所發現的內容構建對應檔。)
圖28. Hibernate Synchronizer的映射嚮導
Hibernator
最後一個,Hibernator似乎傾向於另一個方向,即,從Java代碼開始產生簡單的Hibernate映射文檔,然後讓您從映射文檔構建(或更新)資料庫模式。它還提供在Eclipse中運行資料庫查詢的能力。在這3種外掛程式中,它所處的開發階段似乎最早,但是已經值得關注了,特別是因為它的開發人員是HibernateTeam Dev的成員。