程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 開源-給hibernateTools寫個插件

開源-給hibernateTools寫個插件

編輯:關於JAVA

最近准備把進銷存項目激活,這樣一方面可以讓更多的人有機會參與到開源開發中來,另一方面也把SQL翻譯器、SQL優化器、JDBMonitor應用到這個項目中,這樣這三個基礎模塊就可以在實際項目應用中得到驗證和增強。

我准備用hibernate實現持久層,於是到hibernate的網站上把hibernate3下載下來,看了看有個hibernatetools,是個hibernate在eclipse下的輔助工具,也down了下來,用了用感覺不錯。可以直接從數據庫表生成POJO和hbm.xml(其實我不是很喜歡這種開發方式,我更喜歡我用建模工具來寫POJO,然後用工具生成hbm.xml和DDL,不過好像hibernate3現在還沒有這種工具,如果哪位朋友知道有這種工具,希望賜教)。

美中不足的是它生成的javabean的字段名是完全和數據庫字段名一致、生成的javabean的類名是完全和數據庫表名一致。出於清晰以及可移植的考慮(也是公司的開發規范養成的習慣),我設計的表名全部以"T_"開頭,中間再加上子系統名,最後才是表意的表名,比如用“T_PS_BOM”表示生產管理系統中的物料清單表;字段名全部以“F”開頭,比如FId,FName。

這樣就導致生成了如下的javabean:

public class TPSBOM
{
.......
public String getFID()
...
public String getFNumber()
}

看起來很不直觀。我剛剛想放棄這個工具,想了想,“拿來就用,不好用就換”可不是做開源人該有的精神呀。鑽研一下。

看看了Hibernate Code Generation頁簽中有一個“reveng Strategy”,什麼意思?“反向工程策略”??好像有門兒,點擊“Browse”彈出一個類選擇對話框,竟然看到了它默認顯示的“DefaultReverseEngineeringStrategy”類了,我在hibernatetools的安裝目錄找來找去,終於在plugins\org.hibernate.eclipse_3.2.0.beta6\lib\tools下的hibernate-tools.jar中找到了這個類的影子,用反編譯工具反編譯一下(懶得去網上下源碼了,呵呵)。一個個方法名展現在我面前:

tableToClassName

columnToPropertyName

columnToHibernateTypeName

。。。

這不就是在把數據庫相應的項映射成java相應的項嗎?

開工!

新建一個類CowNewReverseEngineeringStrategy,繼承自DefaultReverseEngineeringStrategy,override tableToClassName、

columnToPropertyName這兩個方法,在這兩個方法中寫入自己的轉換邏輯。

然後打包成jar包,放到plugins\org.hibernate.eclipse_3.2.0.beta6\lib\tools下,然後在plugins\org.hibernate.eclipse_3.2.0.beta6\lib\tools\MANIFEST.MF中把這個新增包的內容加上,關閉eclipse,加個-clean參數啟動eclipse,然後點擊“Hibernate Code Generation”,把“reveng Strategy”填成“com.cownew.DevTools.hibtools.RevEng.CowNewReverseEngineeringStrategy”,“Run”!!!

暈倒,竟然報錯“com.cownew.DevTools.hibtools.RevEng.CowNewReverseEngineeringStrategy

Exception while generating code

Reason org.hibernate.console.HibernateConsoleRunTimeException:Could not create or find com. with one argument deleate constructor”

看來是反射調用的時候出了問題,重新打開hibernate-tools.jar,仔細觀察,竟然發現了一個DelegatingReverseEngineeringStrategy,它多 了一個參數為“ReverseEngineeringStrategy delegate”的構造函數,而其他調用都是轉發給ReverseEngineeringStrategy了,暈倒,搞不懂它在做什麼,也沒時間研究了,給CowNewReverseEngineeringStrategy也曾街一個參數為“ReverseEngineeringStrategy delegate”的構造函數,重新打包,重新啟動eclipse,哈哈,一切搞定,終於生成我可愛的,

public class PersonInfo
{
public String getNumber()。。。
public String getId()。。。

了。
附全部代碼:
package com.cownew.DevTools.hibtools.RevEng;
import java.beans.Introspector;
import org.hibernate.cfg.reveng.DefaultReverseEngineeringStrategy;
import org.hibernate.cfg.reveng.ReverseEngineeringSettings;
import org.hibernate.cfg.reveng.ReverseEngineeringStrategy;
import org.hibernate.cfg.reveng.ReverseEngineeringStrategyUtil;
import org.hibernate.cfg.reveng.TableIdentifier;
import org.hibernate.util.StringHelper;
public class CowNewReverseEngineeringStrategy extends
DefaultReverseEngineeringStrategy
{
public CowNewReverseEngineeringStrategy(ReverseEngineeringStrategy delegate)
{
super();
}
private ReverseEngineeringSettings settings = new ReverseEngineeringSettings();
public String tableToClassName(TableIdentifier table)
{
String tableName = table.getName();
if (tableName != null && tableName.toUpperCase().startsWith("T_"))
{
String pkgName = settings.getDefaultPackageName();
int lastIndex = tableName.lastIndexOf('_');
tableName = tableName.substring(lastIndex + 1, tableName.length())
+ "Info";
String className = toUpperCamelCase(tableName);
if (pkgName.length() > 0)
return StringHelper.qualify(pkgName, className);
return className;
} else
{
return super.tableToClassName(table);
}
};
public String columnToPropertyName(TableIdentifier table, String column)
{
if (column != null && column.toUpperCase().startsWith("F"))
{
String cownewColName = column.substring(1, column.length());
String decapitalize = Introspector
.decapitalize(toUpperCamelCase(cownewColName));
return keywordCheck(decapitalize);
} else
{
return super.columnToPropertyName(table, column);
}
}
private String keywordCheck(String possibleKeyword)
{
if (ReverseEngineeringStrategyUtil
.isReservedJavaKeyword(possibleKeyword))
possibleKeyword += "_";
return possibleKeyword;
}
public void setSettings(ReverseEngineeringSettings settings)
{
super.setSettings(settings);
this.settings = settings;
}
public static void main(String[] args)
{
TableIdentifier table = new TableIdentifier("T_BD_Person");
//TableIdentifier table = new TableIdentifier("T_Person");
//TableIdentifier table = new TableIdentifier("Person");
CowNewReverseEngineeringStrategy revEng = new CowNewReverseEngineeringStrategy(null);
String className = revEng.tableToClassName(table);
System.out.println(className);
System.out.println(revEng.columnToPropertyName(table, "FId"));
System.out.println(revEng.columnToPropertyName(table, "Id"));
}
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved