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

Hibernate學習筆記(三):NamingStrategy統一規範表名欄位名前綴後綴分隔符

     編輯:Java 相關知識

實際專案常面臨命名規範變更:開發期類名User(id,name,password,createTime),客戶要求表名T_前綴、欄位stu_前綴、下劃線分隔、大寫T_USER(STU_ID,STU_NAME,STU_CREATE_TIME)。百張表百字段逐一修改映射文件?不現實。本文實現NamingStrategy介面,零侵入式統一轉換。

Hibernate映射讀取流程與介面切入點

讀取.hbm.xml時:

  • class標籤:table屬性為null → 呼叫classToTableName();非null → 呼叫tableName()
  • property標籤:column為null → 先propertyToColumnName()再logicalColumnName();非null → 直接logicalColumnName()再columnName()

實現org.hibernate.cfg.NamingStrategy介面即可攔截統一處理。

核心實現:MyNamingStrategy

public class MyNamingStrategy implements NamingStrategy {
    // 單例模式,支援多種配置源
    private static MyNamingStrategy instance = null;
    private static DatabaseConfiguration dbcfg = null;

    // 表名轉換:大小寫風格 → 前後綴 → 分隔符
    public String classToTableName(String className) {
        if (className == null) return null;
        String str = UpdateStyle(className, dbcfg.getTableStyle().name());
        str = addPrefixORStuffix(str, dbcfg.getTablePrefix(), dbcfg.getTableSuffix());
        str = addSeparator(str, dbcfg.getTableSeparator());
        return str;
    }

    // 欄位名轉換(columnName/logicalColumnName/propertyToColumnName/foreignKeyColumnName/joinKeyColumnName同邏輯)
    public String columnName(String columnName) {
        if (columnName == null) return null;
        String str = UpdateStyle(columnName, dbcfg.getColumnTyle().name());
        str = addPrefixORStuffix(StringHelper.unqualify(str), dbcfg.getColumnPrefix(), dbcfg.getColumnSuffix());
        str = addSeparator(str, dbcfg.getColumnSeparator());
        return str;
    }

    // 輔助方法:大小寫風格(AU/AL/FU/FL)、前後綴插入、駝峰轉分隔符
    private String UpdateStyle(String str, String style) { ... }
    private String addPrefixORStuffix(String str, String prefix, String suffix) { ... }
    private String addSeparator(String str, String flag) { ... }  // 駝峰邊界插入分隔符
}

配置類:DatabaseConfiguration

public final class DatabaseConfiguration {
    public enum ColumnTyle { AU, AL, FU, FL }  // 全大寫/全小寫/首字母大寫/首字母小寫其餘大寫
    public enum TableStyle { AU, AL, FU, FL }

    private ColumnTyle columnTyle = ColumnTyle.FL;
    private TableStyle tableStyle = TableStyle.FU;
    private String tablePrefix = "", tableSuffix = "", tableSeparator = "";
    private String columnPrefix = "", columnSuffix = "", columnSeparator = "";

    // 從Hibernate配置讀取屬性
    private void ReadConfig(Configuration cfg) {
        tableStyle = TableStyle.valueOf(cfg.getProperty("tablestyle"));
        tablePrefix = cfg.getProperty("tablePrefix");
        // ... 其他屬性同理
    }
}

hibernate.cfg.xml聲明式配置

<property name="tablestyle">FU</property>
<property name="tablePrefix">T_</property>
<property name="tablesuffix"></property>
<property name="tableseparator">_</property>
<property name="columntyle">FU</property>
<property name="columnPrefix">stu_</property>
<property name="columnsuffix"></property>
<property name="columnseparator">_</property>

映射文件可保持原樣

<class name="com.bjpowernode.hibernate.User" table="Users">
    <id name="id" column="pid"><generator class="uuid"/></id>
    <property name="name" column="userName"/>
    <property name="password" column="pwd"/>
    <property name="createTime"/>
    <property name="expireTime"/>
</class>

關鍵:啟用NamingStrategy

Configuration cfg = new Configuration()
    .setNamingStrategy(MyNamingStrategy.getInstance())  // 必須先設置再configure()
    .configure();
SchemaExport export = new SchemaExport(cfg);
export.create(true, true);

生成結果驗證

表名T_USERS、欄位STU_PID/STU_USER_NAME/STU_PWD/STU_CREATE_TIME/STU_EXPIRE_TIME完美符合規範。

增刪改查同樣生效

SessionFactory建立時同樣setNamingStrategy()即可,CRUD操作自動應用命名轉換。

現成JAR包分享

百度網盤下載,開箱即用。

參考:一口一口吃掉Hibernate(三)

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