首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

開源實踐:為 Hibernate Tools 撰寫客製化逆向工程策略外掛

     編輯:Java 相關知識

緣起

啟動進銷存開源專案,採用 Hibernate 持久層。Hibernate Tools 可從資料庫生成 POJO 與 .hbm.xml,但預設策略將資料庫欄位名、表名直接映射為 Java 屬性名、類別名。專案規範:表名以 T_ 開頭 + 子系統縮寫 + 業務名(如 T_PS_BOM),欄位名以 F 開頭(如 FId, FName)。直接生成產出 TPSBOM 類別與 getFID() 方法,極不直觀。

探索擴展點

Hibernate Tools 代碼生成頁籤有 reveng Strategy(逆向工程策略)選項,預設顯示 DefaultReverseEngineeringStrategy。在 hibernate-tools.jar 中找到該類,反編譯發現關鍵方法:

  • tableToClassName
  • columnToPropertyName
  • columnToHibernateTypeName

即為資料庫元素映射至 Java 元素的核心邏輯。

實作客製化策略類

  1. 新建 CowNewReverseEngineeringStrategy 繼承 DefaultReverseEngineeringStrategy。
  2. 覆寫 tableToClassName:移除 T_ 前綴與子系統段,取最後一段加 Info 後綴(如 T_BD_Person → PersonInfo)。
  3. 覆寫 columnToPropertyName:移除欄位首字母 F,駝峰化並處理 Java 保留字(如 FId → id)。
  4. 需額外實作帶 ReverseEngineeringStrategy delegate 參數的建構子(委派模式要求)。

部署與驗證

  1. 打包為 JAR,置於 plugins/org.hibernate.eclipse_3.2.0.beta6/lib/tools。
  2. 修改該目錄 MANIFEST.MF 加入新 JAR。
  3. Eclipse 加 -clean 參數重啟。
  4. Hibernate Tools 代碼生成視窗 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 產出符合專案慣例的程式碼,提升開發效率與程式碼品質。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved