在項目中,往往會用到myeclipse的自動生成代碼功能,比如本人項目用其從數據庫表生成對應的實體類和映射文件,但是,由於數據庫表字段名稱很不規范,無業務含義很難認,用myeclipse默認的規則生成得到的實體屬性名是駝峰命名,很難由此推斷出對應的數據庫表字段名,故項目制定統一規范,實體類屬性名為表字段名小寫。需要修改默認的代碼生成規則。
網上找了不少資料以及文檔,方法總結如下:
方法一:修改myeclipse中自動生成代碼的模板文件
在myeclipse目錄中搜索關鍵字"templates",可以找到一個如myeclipse_templates_6.0.1GA.zip的包,解壓即可得到自動生成代碼用到的所有模板文件,如需修改其中幾個模板文件,則按原目錄結構只留下修改的模板文件。在Hibernate Reverse-Engineering的對話框中,鈎選Use custom templates,輸入你存放修改后模板文件的文件夾(custom_myeclipse_templates)路徑,就可以使用到自定義的模板了。具體看參考該包的說明文檔。
方法二:集成並自定義反轉策略類
自定義一個類,繼承自org.hibernate.cfg.reveng.DelegatingReverseEngineeringStrategy,覆蓋其中生成代碼的方法。具體參考方法一中那個包的說明文檔。
我把其中一個例子貼出來如下,在自動生成的所有實體屬性名前加"ME_"前綴下:
5.6 sing a custom reverse engineering strategy
- Add the MyEclipse Persistence Tools library to your project.
- Right click your project and select Properties.
- On the Java Build Path page, choose Add Library... on the Libraries tab.
- Choose MyEclipse Libraries and then MyEclipse Persistence Tools.
- Press Finish.
Figure 16. Adding the MyEclipse Persistence Tools library
- Create a new class in your project which extends the org.hibernate.cfg.reveng.DelegatingReverseEngineeringStrategy class.
- Define the single argument constructor and override a method of interest, for example, columnToPropertyName.
Here's an example which prefixes all generated propertes with "ME_"
| MyStrategy.java |
| package com.genuitec.hibernate; |
- Figure 17. MyStrategy.java Source Code Listing
- On page 2 of the reverse engineering wizard, specify the class you just created
Figure 18. Specifying the reverse engineering strategy
附資料一:
自定義Struts的JSP模板和Hibernate的DAO模板
這一陣子在MyEclipse里做項目,用到了Struts和hibernate功能,起初,對自動生成贊不絕口,但后來,發現自動生成的代碼也有不方便的地方,比如:
一Struts
當new一個JSP,使用Standard JSP using Struts 1.2時,生成的頁面代碼中只包含了Struts標簽但很多時候,我們需要在頁面中使用到JSTL標簽,我們應該把常用的幾個JSTL標簽加到JSP頁 面中,就像這樣:
其次,Struts1.2的 似乎有些問題,它表示的地址是當前頁面的地址,而不是應用程序的根目錄,因此,這個base我們還是得用內嵌的Java代碼得到,就像這樣:
String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":" +request.getServerPort()+path+"/";
然后在之間加入base標簽:
這樣,用起來才比較方便一點但每次都改頁面,顯然做了很多重復的勞動,我想MyEclipse在生成這樣的頁面時,肯定用到了模板那么到底是那個模板呢?我們來搜搜看
首先說明一下,我用的不是MyEclipse的All-In-One安裝,所以有兩個目錄,一個是Eclipse的解壓目錄,另一個才是 MyEclipse的安裝目錄:MyEclipse 5.5.1 GA如果用的All-In-One安裝,可能只有一個目錄,就是MyEclipse 5.5.1 GA這里,我就把這個目錄稱為安裝目錄了
在安裝目錄下搜索:Struts-1_2.vtl,可以得到這個文件,打開看看,其頭部結構與生成的頁面很相似,因此,我們只需要在適當的地方添上自己的代碼即可修改前還是要注意備份
二hibernate
使用Hibernate Reverse Engineering最大的好處就是它可以自動生成PO和DAO的源碼,以及映射配置文件但是看看DAO的代碼,才發現里面的數據庫操作方法都是實例 方法,用起來還必須先new一個DAO,個人覺得沒有這個必要,使用靜態方法就可以了,但我不可能給每個DAO的每個方法都加一個static吧於是, 跟上面一樣,改模板
首先得分析一下,生成的DAO是繼承的BaseHibernateDAO,而BaseHibernateDAO是擴展的 IBaseHibernateDAO接口,在這個接口中,定義了getSession方法要把數據庫操作方法改成static,這個 getSession方法也必須是static,但是在接口中不能定義是static的方法,那么唯一的辦法就是不管IBaseHibernateDAO 接口,在BaseHibernateDAO類中自己實現一個靜態的getSession方法
BaseHibernateDAO有模板文件,但是沒有必要改它,因為一個工程只用得到一個BaseHibernateDAO我們要改的模板文件是用於 生成具體DAO類的然而在安裝目錄下用hibernate關鍵字搜一搜,並沒有發現哪個文件與我們的DAO有關,難道MyEclipse把生成規則寫死 在代碼里了嗎?
我不相信MyEclipse的開發人員那么糊塗,於是用templates關鍵字搜索了一下,發現了這個: myeclipse_templates_5.5GA.zip,打開一點,發現里面全部是有關hibernate的模板文件,另外有一個readme的說 明,關鍵部分如下:
2) Edit the velocity templates you wish to customize. Note: POJO templates are present in the pojo folder DAO template in the dao folder HBM templates in the hbm folder 3) Optional: Though not necessary, it is recommended that you delete the velocity templates you do not plan to customize. This will prevent future confusion over which templates are being processed by MyEclipse. 4) Invoke the JPA/EJB3/Hibernate Reverse-Engineering wizard and select "Use custom templates". Manually enter or click the browse button to select the myeclipse_templates_5.5GA folder.
上面的意思是:把解壓之后的文件夾放在一個方便的地方(不需要放在原目錄下,那樣找起來很不方便),修改它,然后刪掉其他你沒有修改的文件,以免發生可能的沖突,最后,在Hibernate Reverse-Engineering的對話框中,鈎選Use custom templates,輸入你解壓后的文件夾(myeclipse_templates_5.5GA)路徑,就可以使用到自定義的模板了
照這個意思,我修改了DAO文件夾下的daohome.vm和facadeif.vm,在其中所有的public標識后加上了static(我也不知道哪 些是hibernatet真正用到的,反正我不用EJB和JPA)然后照它的意思試 了一把,果然,DAO方法全變成了static
附資料二:
Hibernate Reverse Engineering 向導
Java src folder 選中映射文件, POJO 和 DAO 生成后所在的項目和源碼文件夾.
Java package 映射文件, POJO 和 DAO 生成后所在的包.
Hibernate mapping file 從選中的表格生成映射文件.
Update hibernate configuration 將生成后的映射文件添加到 Hibernate 配置文件中.
Java Data Object 為映射文件和表格生成對應的數據對象 (POJO).
Create abstract class 為每個數據對象生成一個抽象的父類. 這個抽象類將在以后的重新生成過程中覆蓋掉, 但是對應的子類將不會被覆蓋掉.
Base persistence class 如果需要的話, 輸入生成的 POJO 所要集成的父類的完整名稱.
Java Data Access Object 生成便於訪問映射后的類和表格的數據訪問對象. 用戶可以在 Basic, Spring 和 JNDI DAO 中選擇一種.
Generate precise findBy methods 為映射類中的每個屬性生成一個 "findBy" 方法. 例如 findByFirstName("name");
Use custom templates 覆蓋 MyEclipse 的內部 velocity 模版為你自己的版本.參考 使用模版來更好的調節生成的代碼 來獲取更多信息.
Template directory 包含了自定義模版的目錄樹的根節點.
圖 14. Hibernate Reverse Engineering 向導 - 第 2 頁
第 2 頁可以使用默認的設置, 選擇 Next.
表 5 - Hibernate Reverse Engineering 向導 - 第 2 頁
Rev-eng settings file 這個文件包含了反向工程的配置和選項以供以后使用. 點擊 Setup... 按鈕來選擇現有的文件或者創建一個新的文件.如果找不到一個這樣的配置文件的話向導將會自動創建此文件.
Custom rev-eng strategy 允許你指定一個自定義的反向工程策略類. 這個類允許你用編程的方式來自定義反向工程處理過程的各個方面. 參考 使用自定義反向工程策略 來獲取詳細信息.
Type Mapping 決定是否在類型映射屬性中使用 Java 或者 Hibernate 類型, 例如 java.lang.String 對應 string. 這個設置只能在向導第 3 頁的 Customized Type Mappings 列表中沒有指定更多信息時才能使用.
ID Generator ID Generator 是 Hibernate 映射文件必須有的內容. 它定義了持久類實例的唯一主鍵生成器 Jaav 類. 參考 資源 部分里面的 Hibernate 文檔鏈接, 里面描述了每個 ID 生成器的詳細信息.如果留空或者更詳細的配置在這個向導的第 3 頁沒有配置, Hibernate 映射引擎將自動為你選擇一個 ID 生成器.
Generate basic typed composite IDs 如果數據庫表格包含有多個列的主鍵, 將總是使用 <復合主鍵> 映射.如果這個選項啟用並且有對應的多個外鍵, 每個主鍵列將依然會被作為'簡單的' 標量 (string, long, 等), 而不是引用到一個實體. 將會創建 <many-to-one> 元素, 但是它們將會標記為非可更新和非可插入的字段.如果你禁用這個選項(默認推薦用這種方式), 將會創建 <key-many-to-one> 元素來代替上面的生成內容.
Generate version and timestamp tags 如果啟用, 名為 "version" 和 "timestamp" 的列將會在生成的映射文件中作為 <version> 和 <timestamp> 標記出現.
Customized Type Mappings 允許你來指定一個自定義的 JDBC 類型到 Hibernate 類型的轉換, 使用 Length, Scale, Precision 和 Nullability 作為精度控制對應原來的 JDBC 類型.
# 再第 3 頁頁可以使用默認的設置, 選擇 Finish 將啟動反向工程處理.
圖 15. Hibernate Reverse Engineering 向導 - 第 3 頁
表 6 - Hibernate Reverse Engineering 向導 - 第 3 頁
Class name 對應當前數據庫表格的數據對象類的完整名稱.
ID Generator 想要對當前表所使用的 ID 生成器.
JDBC type 對當前列所使用的 JDBC 類型覆蓋.
Property name 對應當前列所生成的屬性名.
Hibernate type 對應當前列的 Hibernate 類型.
Include referenced / referencing tables 包含反向工程時當前數據庫表引用的表格以及其它引用到當前表的數據庫表.
Generate support for ListedTable(fk)->UnlistedTable and UnlistedTable(fk)->ListedTable 生成關聯到當前表格的關聯表的尚未反向工程過的代碼, 這些表在當前配置頁面尚未被顯示.在這個向導完成之后將會進行下面所列的操作:
*創建類 AbstractEchoMessage . 這個抽象類提供了所需的 Hibernate 兼容的功能例如 public 的讀取器和設置器方法, 這些方法對應的持久化屬性和 ECHO_MESSAGE 數據庫表格中的列相對應.
*創建了一個 EchoMessage Java 類, 是 AbstractEchoMessage 類的一個具體的子類. EchoMessage 的目的是為了被修改后提供額外的業務和驗證邏輯, 並且不會被后續的生成代碼過程所覆蓋.
*創建了 EchoMessage.hbm.xml Hibernate 映射描述符. 這個文件指示 Hibernate 如何將 EchoMessage Java 類和 ECHO_MESSAGE 數據庫表格中的數據相互映射.
*在文件 hibernate.cfg.xml 中注冊 EchoMessage.hbm.xml 映射描述符.
*創建了 Java 類 EchoMessageDAO. 這個類提供了對 EchoMessage 數據對象類的方便的訪問和操作.
*創建 IBaseHibernateDAO 接口和 BaseHibernateDAO 類. 這些類對基本的 DAO 來說是必要的, 因為它使用了添加 Hibernate 功能時候所生成的 Session 工廠類(com.genuitec.hibernate.HibernateSessionFactory)來獲取 Hibernate 會話.
圖 15 高亮顯示了所生成的類, 關鍵方法和映射文件, 以及被添加到 hibernate.cfg.xml 文件中的對生成的映射文件的引用.
圖 15. Hibernate 反向工廠向導執行結束后更新過的項目內容
5.5 使用模版調整生成更好的代碼
* e.doc/html/quickstarts/hibernate/myeclipse_templates_5.5GA.zip">這個文件到你的電腦的文件系統上.
* 按照 README.txt 文件中的說明來自定義這個模版.
* 調用反向工程向導, 在第 1 頁選擇啟用 Use custom templates 選項, 然后將 Template directory 指向到包含模版樹的文件夾e.
5.6 使用自定義反向工程策略
1. 向你的項目中添加 MyEclipse Persistence Tools 類庫.
* 右鍵點擊你的項目然后選擇 Properties.
* 在 Java Build Path 頁面, 在 Libraries 面板下選擇 Add Library....
* 選擇 MyEclipse Libraries ,接着選中 MyEclipse Persistence Tools.
* 點擊 Finish.
圖 16. 添加 MyEclipse Persistence Tools 類庫
2. 在你的項目中創建一個新類, 讓這個類繼承自 org.hibernate.cfg.reveng.DelegatingReverseEngineeringStrategy 類.
3. 定義一個單參數的構造器, 然后覆蓋其中的感興趣的一個或者多個方法, 例如, 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 class MyStrategy extends DelegatingReverseEngineeringStrategy {
public MyStrategy(ReverseEngineeringStrategy strategy) {
super (strategy);
}
public String columnToPropertyName(TableIdentifier table, String columnName) {
return "ME_" + super.columnToPropertyName(table, columnName);
}
}
圖 17. MyStrategy.java 源代碼清單
4. 在反向工程向導的第 2 頁, 選中剛才所創建的類
圖 18. 指定反向工程策略
5.7 編輯映射文件
MyEclipse 包含了定制過的 XML 編輯器來專門用於修改 Hibernate 映射文件 (*.hbm.xml). 當雙擊映射文件的時候編輯器將會自動打開. 你也可以通過右鍵點擊文件然后選擇 Open With > MyEclipse Hibernate Mapping Editor.功能
* 超鏈接瀏覽到引用到的類和屬性.
* 類名自動完成提示.
* 屬性名自動完成提示.
* 映射文件元素, 屬性和值的內容完成提示.
圖 19. Hibernate 映射文件編輯器
