<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[Heck's  Blog]]></title> 
<link>https://www.heckjj.com/index.php</link> 
<description><![CDATA[一瞬间的决定，往往可以改变很多，事实上，让自己成功的往往不是知识，是精神！ 如果你总是为自己找借口，那只好让成功推迟。执行力，今天！]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[Heck's  Blog]]></copyright>
<item>
<link>https://www.heckjj.com/NamingStrategy-dynamic-table-map/</link>
<title><![CDATA[NamingStrategy实现动态表名的映射]]></title> 
<author>Heck &lt;@hecks.tk&gt;</author>
<category><![CDATA[编程杂谈]]></category>
<pubDate>Fri, 15 Oct 2010 08:04:11 +0000</pubDate> 
<guid>https://www.heckjj.com/NamingStrategy-dynamic-table-map/</guid> 
<description>
<![CDATA[ 
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-family: 微软雅黑;">用一个配置文件，一个类去映射多个表，（每个表的结构相同）。按照平时的做法，有多少个表就要 <br/>写多少个配置文件，岂不是很麻烦。怎样才能只写一个配置文件就能达到上述目的呢？ <br/><br/>&nbsp;&nbsp; 经过研究，发现Hibernate中的NamingStrategy可以达到这个目的。它是用来定义表名和列名映射规 <br/>则的一个接口。我们要通过实现这个接口来实现自己的命名策略。这个接口中包含的十个方法，其中的 <br/>public String classToTableName(String className)是通过类名来映射表名的。实现我们的想法就要用 <br/>到这个方法。好了，下面来看怎么做： <br/><br/>&nbsp;&nbsp; 1、自定义一个类MyNamingStrategy来实现NamingStrategy。(这样你要实现10个方法，如果其他方法 <br/>不需要，我们可以通过继承它的一个适配器类DefaultNamingStrategy来只实现我们需要的方法)好了，我 <br/>们就继承DefaultNamingStrategy 吧。<br/>&nbsp;&nbsp; <br/>&nbsp;&nbsp; 2、实现public String classToTableName(String className)方法来实现自己命名策略。 <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;例如业务需要是每隔一个月就要换一个表。比如1月用biz_1，那么2月就用biz_2....但是这些表的结构是相同的。我们要做的就是通过获得月份来动态的选择表。我们从这个方法中这样写： <br/>&nbsp;&nbsp;&nbsp;&nbsp;public class MyNamingStrategy extends DefaultNamingStrategy &#123; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public static final MyNamingStrategy INSTANCE = new MyNamingStrategy(); <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public String classToTableName(String className) &#123; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return &quot;biz_&quot; + Calendar.getInstance().get(Calendar.DAY_OF_MONTH); <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125; <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 好了，这样就可以根据月份来动态的选择表名了。&nbsp;&nbsp;</span><span style="font-family: 微软雅黑;"><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;3、使用命名策略。 <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 要使用这个命名策略可以这样： <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Configuration cfg = new Configuration() <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .setNamingStrategy(MyNamingStrategy.INSTANCE) <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .configure(&quot;hibernate.cfg.xml&quot;) <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .addFile(&quot;biz.hbm.xml&quot;);&nbsp;&nbsp;</span><br/>---------------------------------- <br/>for exemple<textarea name="code" class="java" rows="15" cols="100">
package com.etong.common.hibernate; 
import net.sf.hibernate.cfg.NamingStrategy; 
import net.sf.hibernate.util.StringHelper; 

/** 
* &lt;p&gt;Title: TNamingStrategy&lt;/p&gt; 
* &lt;p&gt;Description: &lt;/p&gt; 
* &lt;p&gt;Copyright: Copyright (c) 2010&lt;/p&gt; 
* &lt;p&gt;Company: &lt;/p&gt; 
* &lt;p&gt;Created on 2010-9-30 &lt;/p&gt; 
* @author Heck
* @version 1.0 
* 
*/ 

public class TNamingStrategy implements NamingStrategy &#123; 
/** 
* @see net.sf.hibernate.cfg.NamingStrategy#classToTableName(java.lang.String) 
*/ 
public String classToTableName(String className) &#123; 
return tableName(StringHelper.unqualify(className).toUpperCase()); 
&#125; 

/** 
* @see net.sf.hibernate.cfg.NamingStrategy#propertyToColumnName(java.lang.String) 
* @todo 
*/ 
public String propertyToColumnName(String arg0) &#123; 
return null; 
&#125; 

/** 
* @see net.sf.hibernate.cfg.NamingStrategy#tableName(java.lang.String) 
*/ 
public String tableName(String tableName) &#123; 
return &quot;TBL_&quot; + tableName.toUpperCase(); 
&#125; 

/** 
* @see net.sf.hibernate.cfg.NamingStrategy#columnName(java.lang.String) 
*/ 
public String columnName(String columnName) &#123; 
return &quot;COL_&quot; + columnName; 
&#125; 

/** 
* @see net.sf.hibernate.cfg.NamingStrategy#propertyToTableName(java.lang.String, java.lang.String) 
* @todo 
*/ 
public String propertyToTableName(String arg0, String arg1) &#123; 
return null; 
&#125; 
&#125; </textarea><br/>Tags - <a href="https://www.heckjj.com/tags/namingstrategy/" rel="tag">namingstrategy</a> , <a href="https://www.heckjj.com/tags/%25E5%258A%25A8%25E6%2580%2581/" rel="tag">动态</a> , <a href="https://www.heckjj.com/tags/%25E8%25A1%25A8%25E5%2590%258D/" rel="tag">表名</a> , <a href="https://www.heckjj.com/tags/%25E6%2598%25A0%25E5%25B0%2584/" rel="tag">映射</a>
]]>
</description>
</item><item>
<link>https://www.heckjj.com/NamingStrategy-dynamic-table-map/#blogcomment</link>
<title><![CDATA[[评论] NamingStrategy实现动态表名的映射]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>https://www.heckjj.com/NamingStrategy-dynamic-table-map/#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>