引自: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….但是這些表的結構是相同的。我們要做的就是通過獲得月份來動態的選擇表。我們從這個方法中這樣寫:
/**
*這個類是重新定義一個hibernate的命名規范
**/
public class MyNamingStrategy extends DefaultNamingStrategy {
- //這是為了實現單例
- public static final MyNamingStrategy INSTANCE = new MyNamingStrategy();
- //重新定義名稱映射關系
- public String classToTableName(String className) {
- //自己的名稱定義規則
- return “biz_” + Calendar.getInstance().get(Calendar.DAY_OF_MONTH);
- }
- }
好了,這樣就可以根據月份來動態的選擇表名了。
3、使用命名策略。
要使用這個命名策略可以這樣:
Configuration cfg = new Configuration()
.setNamingStrategy(MyNamingStrategy.INSTANCE)
.configure(“hibernate.cfg.xml”)
.addFile(“biz.hbm.xml”);
ok,這樣就可以實現我們的動態表名映射啦!
總結:
很多時候,我是經常被自己的思維所束縛,這是我的一種思維慣性,而且我只要找到一種解決問題的方法,就會當作寶典收藏,別人有比你好的,也會有種排斥的信息,二者恰恰是阻礙我們進步的牢籠,我們應該沖破這曾牢籠,我們應該更大膽些,想到且看到我們和以前截然不同的一面!