hibernate動態表名映射


  引自:http://blog.csdn.net/xvshu/article/details/39187779 

最近的一個項目有一個需求,有N個考核單位,要對每個考核單位生成一張考核情況表,這樣做的目的是橫切數據庫,這這個需求的實現中,我的組員遇到了一個技術問題,我將我的解決辦法和整個思考過程與大家分享,

 

思路:

        用一個配置文件,一個類去映射多個表,(每個表的結構相同)。按照平時的做法,有多少個表就要 寫多少個配置文件,豈不是很麻煩。怎樣才能只寫一個配置文件就能達到上述目的呢? 經過研究,發現hibernate中的NamingStrategy可以達到這個目的。它是用來定義表名和列名映射規 則的一個接口。我們要通過實現這個接口來實現自己的命名策略。這個接口中包含的十個方法,其中的 public String classToTableName(String className)是通過類名來映射表名的。實現我們的想法就要用 到這個方法。好了,下面來看怎么做: 

 

步驟:

1、自定義一個類MyNamingStrategy來實現NamingStrategy。(這樣你要實現10個方法,如果其他方法 不需要,我們可以通過繼承它的一個適配器類DefaultNamingStrategy來只實現我們需要的方法)好了,我 們就繼承DefaultNamingStrategy 吧。 


2、實現public String classToTableName(String className)方法來實現自己命名策略。 


我這的業務需要是每隔一個月就要換一個表。比如1月用biz_1,那么2月就用biz_2….但是這些表的結構是相同的。我們要做的就是通過獲得月份來動態的選擇表。我們從這個方法中這樣寫: 

 

 

[java]  view plain  copy
 

/** 

 *這個類是重新定義一個hibernate的命名規范 

**/  

public class MyNamingStrategy extends DefaultNamingStrategy {   

  1. //這是為了實現單例  
  2. public static final MyNamingStrategy INSTANCE = new MyNamingStrategy();   
  3. //重新定義名稱映射關系  
  4. public String classToTableName(String className) {   
  5. //自己的名稱定義規則  
  6. return “biz_” + Calendar.getInstance().get(Calendar.DAY_OF_MONTH);   
  7.     }   
  8. }



 

 

好了,這樣就可以根據月份來動態的選擇表名了。 


3、使用命名策略。 


要使用這個命名策略可以這樣:  

 

Configuration cfg = new Configuration()   

    .setNamingStrategy(MyNamingStrategy.INSTANCE)   

    .configure(“hibernate.cfg.xml”)  

    .addFile(“biz.hbm.xml”);







ok,這樣就可以實現我們的動態表名映射啦!

 

總結:

很多時候,我是經常被自己的思維所束縛,這是我的一種思維慣性,而且我只要找到一種解決問題的方法,就會當作寶典收藏,別人有比你好的,也會有種排斥的信息,二者恰恰是阻礙我們進步的牢籠,我們應該沖破這曾牢籠,我們應該更大膽些,想到且看到我們和以前截然不同的一面!


免責聲明!

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



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