天天看點

一口一口吃掉Hibernate(三)——Hibernate給表和字段設定前字尾及分隔符

 這種格式的。但是客戶後來要求表名稱要以“t_”開頭,字段名要以“stu_”開頭,可以是一些資料庫的關鍵字,單詞之間以“_”隔開,友善他們維護.例如:T_User(stu_Id,stu_Name,stu_Create_Time)。

      對于上面的問題,正常的方法就是去修改Hibernate_cfg.xml中的表,為每個表添加“t_”,或者寫table屬性,字段也重新使用column屬性來修改。如果你有100張表,每個表平均有10個字段,你還會去一個一個修改麼?還有可能漏掉或者改錯。最“可惡”的是,如果客戶再讓你改成其他的呢,是不是還要全部修改一次?

      有沒有一種方法,不修改原先的配置,添加并配置一下表和字段的前字尾及分隔符等等,既可以完成呢??經過嘗試,終于被我拿下了,現在拿出來與大家分享。

      針對上述問題,我主要用的是NamingStrategy接口。這個接口很有意思,可以作為業務類規範和資料庫表規範的橋梁,它可以表和列的映射關系的轉變和處理。例如一個資料對象User,對應資料庫表是T_USER,如果所有映射關系都是這樣的情況,可以使用NamingStrategy做為一個橋梁銜接,而不用再hbm.xml映射檔案中指定class對應的實體table。

      先說一下Hibernate讀取映射檔案的簡要過程:循環讀取class标簽,判斷class标簽的table屬性值是否為null,若為null,則調用NamingStrategy接口的classToTableName方法将class值轉換并處理(按命名政策NamingStrategy處理)的表名。若不為null,則說明設定了table,那麼調用NamingStrategy接口的tableName方法擷取處理過的表名。循環周遊property,判斷property标簽的column屬性值是否為null,若為null,則首先調用propertyToColumnName方法,将屬性值轉化為列名,再調用logicalColumnName方法。若不為null,則直接調用NamingStrategy接口的logicalColumnName方法,再調用columnName方法進行處理(按命名政策NamingStrategy處理)。

      了解了上面說的這個過程,隻要我們實作NamingStrategy這個接口,就可以随心所欲的修改表映射了。不多說了,直接上代碼吧:

    【MyNamingStrategy】自定義的命名政策,可對表、字段進行統一處理。

【DatabaseConfiguration】資料庫樣式配置,包括前字尾、分隔符、大小寫等

【hibernate.cfg.xml】設定資料庫樣式配置資訊

【User.hbm.xml】映射檔案可以比較随意的修改或者設定了

最後修改一下【ExportDB】,主要是修改必須先設定NamingStrategy,在調用configure方法

      看一下結果圖吧:表名,字段名都已經修改過了。

一口一口吃掉Hibernate(三)——Hibernate給表和字段設定前字尾及分隔符

      上面示範的是生成資料表。在對資料庫的增删改查時,隻要同樣設定NamingStrategy即可。