Hibernate之創建命名策略


       在開發軟件時,通常會要求每個開發人員遵守共同的命名策略。例如,數據庫的表名及字段名的所有字符都要大寫,表名以“S”結尾。對於Customer類,對應的數據庫表名為CUSTOMERS。為了在映射文件中遵守這種命名約定,一種方法是手工設置表名和字段名,但是這種方式很耗時,而且容易出錯。還有一種方式是實現Hibernate的org.hibernate.cfg.NamingStrategy接口。對於這一接口,Hibernate已經提供了兩個參考實現類:

       ① org.hibernate.cfg.DefaultNamingStrategy類:這是NamingStrategy接口的默認實現類。

       ② org.hibernate.cfg.ImprovedNamingStrategy類:這是NamingStategy接口的高級實現類。

      自定義的實現類可以繼承以上兩個參考實現類之一,然后覆蓋其中的部分方法,如:

package mypack;
import org.hibernate.cfg.ImprovedNamingStrategy;
import org.hibernate.util.StringHelper;
public class MyNamingStategy extends ImprovedNamingStrategy{

//unqualify()是hiberante中StringHelper類提供的方法,參數為雷鳴,返回值是不帶包名的類名
public String classToTableName(String className){ return StringHelper.unqualify(className).toUpperCase()+'S'; } public String propertyToColumnName(String propertyName){ return propertyName.toUpperCase(); } public String tableName(String tableName){ return tableName; } public String columnName(String columnName){ return columnName; } public String propertyToTableName(String className,String propertyName){ return classToTableName(className)+'_'+propertyToColumnName(propertyName); } }

       MyNamingStrategy類繼承了ImprovedNamingStrategy類,並覆蓋了它的部分方法。MyNamingStrategy類提供了把類名映射為表名的兩個方法.
      (1)classToTableName(String className)方法:如果在<class>元素中沒有顯示設置表名,Hibernate調用該方法。對於以下映射代碼:

         <class name="mypack.Dictionary">

       hibernate會自動調用classToTableName()方法,參數為"mypack.Dictionary",返回的表名為"DICTIONARYS".

       (2)tableName(String tableName):如果在<class>元素中顯示設置了表名,Hibernate調用該方法,對於以下的映射代碼:

        <class name="mypack.Dictionary" table="DICTIONARIES">

        hibernate會自動調用tableName()方法,參數為"DICTIONARIES",返回的表名仍然是"DICTIONARIES".

       MyNamingStrategy類還提供了把類的屬性名映射為字段名的兩個方法。

       (1)propertyToColumnName(String propertyName)方法:如果在<property>元素中沒有顯示設置字段名,Hibernate調用該方法,對於以下映射代碼:

        <property name="orderNumber"/>

        hibernate會自動調用propertyToColumnName()方法,參數為"orderNumber"返回的字段名為"ORDERNUMBER".

        (2)columnName(String columnName):如果在<property>元素中顯示設置了字段名,Hibernate調用該方法。對於以下映射代碼:

        <property name="orderNumber" column="ORDER_NUMBER"/>

        hibernate會自動調用columnName()方法,參數為"ORDER_NUMBER",返回的字段名仍然是"ORDER_NUMBER".

        為了讓Hibernate采用以上命名方案,需要在Hibernate初始化階段設置Configuration對象的NamingStrategy屬性,代碼如下:

Configuration config = new Configuration()
  .setNamingStrategy(new MyNamingStrategy())
  .configure();
SessionFactory sessionFactory = config.buildSessionFactory();

      通常,在NamingStrategy的ClassToTableName()和propertyToColumnName()方法中定義從類名到表名,以及從屬性名到字段名的默認命名規則。如果在某些情況下需要覆蓋默認命名規則,只需在映射文件中顯示指定表名或者字段名,此時會調用tableName()或者columnName()方法。
      在多用戶環境中,如果每隔用戶需要不同的數據庫命名策略,但是共享同樣的關系數據模型,無須修改映射文檔,只要為每個用戶分配一個SessionFactory對象,各自使用單獨的命名策略。如以下程序中創建了兩個SessionFactory對象:sessionFactory1和sessionFactory2,他們使用的命名策略分別為NamingStrategy1和NamingStrategy2,這兩個類都實現了NamingStrategy接口。

//sessionFactory1采用NamingStrategy1命名策略

Configuration config1 = new Configuration() .setNamingStrategy(new NamingStrategy1()) .configure(); SessionFactory sessionFactory1 = config1.buildSessionFactory(); //sessionFactory2采用NamingStrategy2命名策略 Configuration config2 = new Configuration() .setNamingStrategy(new NamingStrategy2()) .configure(); SessionFactory sessionFactory2 = config2.buildSessionFactory();

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM