5.4 創(chuàng)建 Hibernate Java 表映射
這個部分展示了使用 MyEclipse Hibernate 工具來反向工程生成 Java 數(shù)據(jù)對象并從現(xiàn)有的數(shù)據(jù)庫表格生成映射的過程.
注意: 在我們的例子里我們使用了 TEST 數(shù)據(jù)庫下的 ECHO_MESSAGE 表格; 對于其它數(shù)據(jù)庫和表格的操作過程基本上都是一樣的.
另外, 你也可以從 DB Browser 那里拖動表格, 然后將它放到 Hibernate 配置編輯器里也可以啟動這個向?qū)?
注意: 你可以在 DB Browser 中選中多個表格然后同時對它們進行反向工程.


圖 12. 對 ECHO_MESSAGE 數(shù)據(jù)庫表格啟動 Hibernate Reverse Engineering 向?qū)?/span>
Hibernate Reverse Engineering 向?qū)б还灿?3 頁.

圖 13. Hibernate Reverse Engineering 向?qū)?- 頁面 1
選擇 HibernateDemo 項目中的src 文件夾. 點擊 Java package輸入框右側(cè)的 Browse... 按鈕然后選中包 com.genuitec.hibernate完成如圖 13 所示的向?qū)е械钠溆嗟膬?nèi)容然后選擇 Next.
注意: 向?qū)У牡?2 頁和第 3 頁用來自定義反向工程處理過程.
當(dāng)然也可以現(xiàn)在就直接點擊 Finish 按鈕開始處理過程, 不對后兩頁的設(shè)置進行任何自定義.
表 4 - Hibernate Reverse Engineering 向?qū)?- 第 1頁
選項 | 描述 |
Java src folder |
選中映射文件, POJO 和 DAO 生成后所在的項目和源碼文件夾. |
Java package |
映射文件, POJO 和 DAO 生成后所在的包. |
Hibernate mapping file |
從選中的表格生成映射文件. |
Update hibernate configuration |
將生成后的映射文件添加到 Hibernate 配置文件中. |
Java Data Object |
為映射文件和表格生成對應(yīng)的數(shù)據(jù)對象 (POJO). |
Create abstract class |
為每個數(shù)據(jù)對象生成一個抽象的父類. 這個抽象類將在以后的重新生成過程中覆蓋掉, 但是對應(yīng)的子類將不會被覆蓋掉. |
Base persistence class |
如果需要的話, 輸入生成的 POJO 所要集成的父類的完整名稱. |
Java Data Access Object |
生成便于訪問映射后的類和表格的數(shù)據(jù)訪問對象. 用戶可以在 Basic, Spring 和 JNDI DAO 中選擇一種. |
Generate precise findBy methods |
為映射類中的每個屬性生成一個 "findBy" 方法. |
Use custom templates |
覆蓋 MyEclipse 的內(nèi)部 velocity 模版為你自己的版本. |
Template directory |
包含了自定義模版的目錄樹的根節(jié)點. |
圖 14. Hibernate Reverse Engineering 向?qū)?- 第 2 頁
表 5 - Hibernate Reverse Engineering 向?qū)?- 第 2 頁
選項 | 描述 |
Rev-eng settings file |
這個文件包含了反向工程的配置和選項以供以后使用. 點擊 Setup... 按鈕來選擇現(xiàn)有的文件或者創(chuàng)建一個新的文件. |
Custom rev-eng strategy |
允許你指定一個自定義的反向工程策略類. 這個類允許你用編程的方式來自定義反向工程處理過程的各個方面. 參考 使用自定義反向工程策略 來獲取詳細(xì)信息. |
Type Mapping |
決定是否在類型映射屬性中使用 Java 或者 Hibernate 類型, 例如 java.lang.String 對應(yīng) string. 這個設(shè)置只能在向?qū)У?3 頁的 Customized Type Mappings 列表中沒有指定更多信息時才能使用. |
ID Generator |
ID Generator 是 Hibernate 映射文件必須有的內(nèi)容. 它定義了持久類實例的唯一主鍵生成器 Jaav 類. 參考 資源 部分里面的 Hibernate 文檔鏈接, 里面描述了每個 ID 生成器的詳細(xì)信息. |
Generate basic typed composite IDs |
如果數(shù)據(jù)庫表格包含有多個列的主鍵, 將總是使用 <復(fù)合主鍵> 映射. |
Generate version and timestamp tags |
如果啟用, 名為 "version" 和 "timestamp" 的列將會在生成的映射文件中作為 <version> 和 <timestamp> 標(biāo)記出現(xiàn). |
Customized Type Mappings |
允許你來指定一個自定義的 JDBC 類型到 Hibernate 類型的轉(zhuǎn)換, 使用 Length, Scale, Precision 和 Nullability 作為精度控制對應(yīng)原來的 JDBC 類型. |
再第 3 頁頁可以使用默認(rèn)的設(shè)置, 選擇 Finish 將啟動反向工程處理.


圖 15. Hibernate Reverse Engineering 向?qū)?- 第 3 頁
表 6 - Hibernate Reverse Engineering 向?qū)?- 第 3頁
選項 | 描述 |
Class name |
對應(yīng)當(dāng)前數(shù)據(jù)庫表格的數(shù)據(jù)對象類的完整名稱. |
ID Generator |
想要對當(dāng)前表所使用的 ID 生成器. |
JDBC type |
對當(dāng)前列所使用的 JDBC 類型覆蓋. |
Property name |
對應(yīng)當(dāng)前列所生成的屬性名. |
Hibernate type |
對應(yīng)當(dāng)前列的 Hibernate 類型. |
Include referenced / referencing tables |
包含反向工程時當(dāng)前數(shù)據(jù)庫表引用的表格以及其它引用到當(dāng)前表的數(shù)據(jù)庫表. |
Generate support for ListedTable(fk)->UnlistedTable and UnlistedTable(fk)->ListedTable |
生成關(guān)聯(lián)到當(dāng)前表格的關(guān)聯(lián)表的尚未反向工程過的代碼, 這些表在當(dāng)前配置頁面尚未被顯示. |
在這個向?qū)瓿芍髮M行下面所列的操作:
圖 15 高亮顯示了所生成的類, 關(guān)鍵方法和映射文件, 以及被添加到 hibernate.cfg.xml 文件中的對生成的映射文件的引用.
圖 15. Hibernate 反向工廠向?qū)?zhí)行結(jié)束后更新過的項目內(nèi)容
—————————————————————————————————————————————————————————————
下載并解壓縮這個文件到你的電腦的文件系統(tǒng)上.按照 README.txt 文件中的說明來自定義這個模版.調(diào)用反向工程向?qū)? 在第 1 頁選擇啟用 Use custom templates 選項, 然后將 Template directory 指向到包含模版樹的文件夾e.5.6 使用自定義反向工程策略
向你的項目中添加 MyEclipse Persistence Tools 類庫.
右鍵點擊你的項目然后選擇 Properties.在 Java Build Path 頁面, 在 Libraries 面板下選擇 Add Library....選擇 MyEclipse Libraries ,接著選中 MyEclipse Persistence Tools.點擊 Finish.


圖 16. 添加 MyEclipse Persistence Tools 類庫
在你的項目中創(chuàng)建一個新類, 讓這個類繼承自 org.hibernate.cfg.reveng.DelegatingReverseEngineeringStrategy 類.定義一個單參數(shù)的構(gòu)造器, 然后覆蓋其中的感興趣的一個或者多個方法, 例如, columnToPropertyName.
這里是一個例子, 將在所有生成的屬性前添加一個 "ME_" 前綴.
MyStrategy.java |
package com.genuitec.hibernate; import org.hibernate.cfg.reveng.DelegatingReverseEngineeringStrategy; import org.hibernate.cfg.reveng.ReverseEngineeringStrategy; import org.hibernate.cfg.reveng.TableIdentifier; public classMyStrategy extendsDelegatingReverseEngineeringStrategy { publicMyStrategy(ReverseEngineeringStrategystrategy) { super(strategy); } publicString columnToPropertyName(TableIdentifier table, String columnName) { return"ME_" + super.columnToPropertyName(table, columnName); } } |
在反向工程向?qū)У牡?2 頁, 選中剛才所創(chuàng)建的類

圖 18. 指定反向工程策略5.7 編輯映射文件
MyEclipse 包含了定制過的 XML 編輯器來專門用于修改 Hibernate 映射文件 (*.hbm.xml). 當(dāng)雙擊映射文件的時候編輯器將會自動打開. 你也可以通過右鍵點擊文件然后選擇 Open With > MyEclipse Hibernate Mapping Editor.
功能

圖 19. Hibernate 映射文件編輯器
—————————————————————————————————————————————————————————————
6. 使用 HQL 編輯器
MyEclipse 包含了一個 Hibernate 查詢語言編輯器以及幾個視圖, 允許你根據(jù)當(dāng)前的 Hibernate 配置來執(zhí)行 HQL 查詢語句.
功能
下面的步驟將指導(dǎo)你如何使用 HQL 編輯器右鍵點擊 Package Explorer 中的 HibernateDemo 項目. 在右鍵菜單中的 MyEclipse 項目下, 選擇 Open HQL Editor...
注意: HQL 編輯器也會在你嘗試查看后綴為 hql 的文件的時候打開.
圖 20. 打開 HQL 編輯器
注意: 總是可以切換到這個視圖, 通過選擇菜單項 Window > Open Perspective > Other > MyEclipse Hibernate當(dāng)編輯器打開時, 鍵入 "from EchoMessage" 點擊 Run 圖標(biāo)或者按下 Ctrl + F9 來執(zhí)行查詢語句.
圖 21. 在 HSQL 編輯器中執(zhí)行查詢
圖 22. Query Parameters 視圖
注意: 如果你在 HSQL 編輯器為特定的項目初始化后修改了配置, 映射文件或者數(shù)據(jù)類, 一定要記得點擊嵌入的工具欄上的 Refresh 按鈕來讓編輯器使用最新的配置信息.
—————————————————————————————————————————————————————————————
7. 測試HibernateDemo應(yīng)用
既然 Hibernate 持久化功能已經(jīng)整合進了 HibernateDemo 項目, 接下來的步驟就是對它進行測試. 一種測試 Hibernate 持久化功能的方法是創(chuàng)建一個帶 main 方法的 Java 類. 測試類將使用 Hibernate 向?qū)傻?Java 對象和 HibernateSessionFactory. 請查看圖 18 中所示的 HibernateSessionFactory 類中所生成的兩個重要的方法, 在測試代碼中將會使用這兩個方法.
|
顯示了 HibernateSessionFactory 中的兩個重要的靜態(tài)方法. getSession(): 這個方法將會返回一個 Session 變量, 可以用來訪問 Hibernate Session 類. 任何時間你想使用 Hibernate 會話的時候你都可以調(diào)用這個方法來獲取緩存過的這個 Hibernate 會話對象. closeSession(): 如果一個會話已經(jīng)啟動過, 這個方法就簡單的關(guān)閉它. |
下面是創(chuàng)建測試類源代碼的步驟列表:

圖 24. 新建 Java 測試類
HibernateReadTest.java |
package com.genuitec.hibernate; import org.hibernate.HibernateException; public class HibernateReadTest { public static void main(String[] args) { // Step 1 - Create the DAO EchoMessageDAO dao = new EchoMessageDAO(); try { // Step 2 - Use findById to retrieve the message with ID = 1 EchoMessage echoMessage = dao.findById(new Long(1)); System.out.println("Entity retrieval successful, message is: " + echoMessage.getMsg()); } catch (HibernateException e) { System.err.println("Entity retrieval failed."); e.printStackTrace(); } finally { try { dao.getSession().close(); } catch (Exception e) { // do nothing } } } } |
這是, Console 視圖將會打開, 如果測試成功的話你將會看到如下面的 圖 21所示的輸出內(nèi)容.
注意: 如果你看到了 log4j 警告, 你可以忽略它們即可.

圖 26. HibernateReadTest Console 輸出
8. 使用示例
HibernateDemo 項目下載 HibernateDemo.zip選擇 Import > Existing Projects into Workspace, 選中 Select archive file 選項然后指向下載的 zip 文件. 點擊 Finish 來導(dǎo)入到你的 Eclipse 工作臺.需要做以下修改來重新配置這個項目和你的開發(fā)環(huán)境保持一致. 從你的數(shù)據(jù)庫復(fù)制 JDBC 驅(qū)動 JAR 文件到項目中. 通過右鍵點擊文件然后選擇 Build Path > Add to Build Path 來將它添加到項目的構(gòu)造路徑中. 連接到你的數(shù)據(jù)庫然后執(zhí)行 DDL/DDL.sql 文件中的代碼來創(chuàng)建示例數(shù)據(jù)庫并填充里面的值.
在執(zhí)行之前, 也許需要修改表格的數(shù)據(jù)庫前綴并使它和你的數(shù)據(jù)庫的 DDL 規(guī)范一致. 修改配置文件 hibernate.cfg.xml , 將里面的連接設(shè)置修改為你自己的數(shù)據(jù)庫配置.還可能需要修改 EchoMessage.hbm.xml 來修改 class 元素里面指定的 schema 屬性為對應(yīng)的數(shù)據(jù)庫名稱. 一些其它的文件已經(jīng)包含在這里:
log4j.properties 用來控制 log4j 類庫里面的日志等級.
ehcache.xml 用來控制 ehcache 類庫.
HibernateWriteTest.java 是一個簡單的演示類來展示 DAO 是如何寫入數(shù)據(jù)到數(shù)據(jù)庫的.
—————————————————————————————————————————————————————————————
9. 總結(jié)
使用 MyEclipse 進行 Hibernate 開發(fā)的教程到此結(jié)束. 我們還有更多的快速入門文檔, 包括如何使用 Database Explorer, Struts, JSF, Web Projects, 修改, 應(yīng)用服務(wù)器配置, EJB 開發(fā), 以及企業(yè)應(yīng)用項目. 更多信息請訪問 MyEclipse Quickstart library .
—————————————————————————————————————————————————————————————
10. 用戶反饋
如果你對本文有評論或者建議, 請?zhí)峤坏?MyEclipse Documentation Forum .
—————————————————————————————————————————————————————————————
11.資源
HibernateDemo 示例項目MyEclipse Reverse-Engineering 模版