實際專案常面臨命名規範變更:開發期類名User(id,name,password,createTime),客戶要求表名T_前綴、欄位stu_前綴、下劃線分隔、大寫T_USER(STU_ID,STU_NAME,STU_CREATE_TIME)。百張表百字段逐一修改映射文件?不現實。本文實現NamingStrategy介面,零侵入式統一轉換。
讀取.hbm.xml時:
class標籤:table屬性為null → 呼叫classToTableName();非null → 呼叫tableName()property標籤:column為null → 先propertyToColumnName()再logicalColumnName();非null → 直接logicalColumnName()再columnName()實現org.hibernate.cfg.NamingStrategy介面即可攔截統一處理。
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) { ... } // 駝峰邊界插入分隔符
}
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");
// ... 其他屬性同理
}
}
<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>
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操作自動應用命名轉換。
百度網盤下載,開箱即用。