如果您在定義映射檔案的時候,沒有特別在<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);
}
}
...
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);
}
}
...