啟動進銷存開源專案,採用 Hibernate 持久層。Hibernate Tools 可從資料庫生成 POJO 與 .hbm.xml,但預設策略將資料庫欄位名、表名直接映射為 Java 屬性名、類別名。專案規範:表名以 T_ 開頭 + 子系統縮寫 + 業務名(如 T_PS_BOM),欄位名以 F 開頭(如 FId, FName)。直接生成產出 TPSBOM 類別與 getFID() 方法,極不直觀。
Hibernate Tools 代碼生成頁籤有 reveng Strategy(逆向工程策略)選項,預設顯示 DefaultReverseEngineeringStrategy。在 hibernate-tools.jar 中找到該類,反編譯發現關鍵方法:
tableToClassNamecolumnToPropertyNamecolumnToHibernateTypeName即為資料庫元素映射至 Java 元素的核心邏輯。
CowNewReverseEngineeringStrategy 繼承 DefaultReverseEngineeringStrategy。tableToClassName:移除 T_ 前綴與子系統段,取最後一段加 Info 後綴(如 T_BD_Person → PersonInfo)。columnToPropertyName:移除欄位首字母 F,駝峰化並處理 Java 保留字(如 FId → id)。ReverseEngineeringStrategy delegate 參數的建構子(委派模式要求)。plugins/org.hibernate.eclipse_3.2.0.beta6/lib/tools。MANIFEST.MF 加入新 JAR。-clean 參數重啟。reveng Strategy 填入完整類名 com.cownew.DevTools.hibtools.RevEng.CowNewReverseEngineeringStrategy,執行生成。成功生成符合規範的程式碼:
public class PersonInfo {
public String getNumber() ...
public String getId() ...
}
package com.cownew.DevTools.hibtools.RevEng;
import java.beans.Introspector;
import org.hibernate.cfg.reveng.*;
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) + "Info";
String className = toUpperCamelCase(tableName);
return pkgName.length() > 0 ? StringHelper.qualify(pkgName, className) : className;
}
return super.tableToClassName(table);
}
public String columnToPropertyName(TableIdentifier table, String column) {
if (column != null && column.toUpperCase().startsWith("F")) {
String cownewColName = column.substring(1);
String decapitalize = Introspector.decapitalize(toUpperCamelCase(cownewColName));
return keywordCheck(decapitalize);
}
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");
CowNewReverseEngineeringStrategy revEng = new CowNewReverseEngineeringStrategy(null);
System.out.println(revEng.tableToClassName(table));
System.out.println(revEng.columnToPropertyName(table, "FId"));
System.out.println(revEng.columnToPropertyName(table, "Id"));
}
}
「拿來就用,不好用就換」非開源精神。深入工具擴展點,以少量程式碼適配團隊規範,讓 Hibernate Tools 產出符合專案慣例的程式碼,提升開發效率與程式碼品質。