實作命名策略


如果您在定義映射檔案的時候,沒有特別在<class>上使用table指定表格名稱, 則Hibernate預設會使用實體類別名稱作為表格名稱,如果沒有特別在<property>上使用column指定欄位 名稱,則 Hibernate預設會使用屬性名稱作為欄位名稱。

您可以實作NamingStrategy來改變這個預設,例如:
  • TNamingStrategy.java
package onlyfun.caterpillar;

import org.hibernate.cfg.ImprovedNamingStrategy;
import org.hibernate.util.StringHelper;

public class TNamingStrategy extends ImprovedNamingStrategy {
public String classToTableName(String className) {
return "T_" + StringHelper.unqualify(className);
}

public String propertyToColumnName(String propertyName) {
return super.propertyToColumnName(propertyName);
}

public String columnName(String columnName) {
return super.columnName(columnName);
}

public String tableName(String tableName) {
return super.tableName(tableName);
}
}

ImprovedNamingStrategy 實作了NamingStrategy介面,在這邊您實作了classToTableName(),如果<class>上沒有 設定table屬 性,則會呼叫這個方法,傳入class名稱,使用StringHelper.unqualify()方法可以協助我們去除套件名稱,在這邊您可以修改名稱 後傳回,Hibernate將使用傳回的字串作為表格名稱。

當設定<property>屬性沒有指定column時,會呼叫 propertyToColumnName()。如果<class>有設定table,則會呼叫tableName(),如 果< property>有設定column,則會呼叫column()。

所以,您可以實作NamingStrategy來改變您設定檔至表格的命名慣例,在讀取映射文件之前,可以先設定 NamingStrategy,之後就可以使用NamingStrategy中定義的命名方式,例如:
...
    private static SessionFactory sessionFactory;
    static {
        try {
            Configuration config = new Configuration();
            config.setNamingStrategy(new TNamingStrategy()).configure();
            sessionFactory = config.buildSessionFactory();
        } catch (Throwable ex) {
            throw new ExceptionInInitializerError(ex);
        }
    }
...