NamingStrategy接口很有意思,可以作为业务类规范和数据库表规范的桥梁,例如一个数据对象User,对应数据库表是 T_USER,如果所有映射关系都是这样的情况,可以使用NamingStrategy做为一个桥梁衔接,当然你也可以在hbx.xml配置文件中指定 class对应的table.

 

hibernate.cfg.xml代码就省略了...

 

User.hbx.xml代码

<hibernate-mapping><class name="User"><id name="id"><generator class="uuid"/></id><property name="firstname"/><property name="age"/></class>
</hibernate-mapping>

 默认映射到对象名和元素名称一致的数据表结构。

 

 User.java代码

public class User {private String id;private String firstname;private int age;/***省略set,get的方法*/}


 

关键TNamingStrategy 代码

public class TNamingStrategy implements NamingStrategy{@Overridepublic String classToTableName(String className) {// TODO Auto-generated method stubreturn tableName(StringHelper.unqualify(className).toUpperCase());}@Overridepublic String columnName(String columnName) {// TODO Auto-generated method stubreturn columnName;}@Overridepublic String propertyToColumnName(String propertyName) {// TODO Auto-generated method stubreturn propertyName.toUpperCase();}@Overridepublic String propertyToTableName(String className, String propertyName) {// TODO Auto-generated method stubreturn classToTableName(className) + '_' + propertyToColumnName(propertyName);}@Overridepublic String tableName(String tableName) {// TODO Auto-generated method stubreturn "T_"+tableName;}}


最后在Configuration 运行时将命名规则设定

Configuration cfg = new Configuration();  
cfg.setNamingStrategy(new TNamingStrategy());
SessionFactory factory = cfg.configure().buildSessionFactory();


这样你的User对象就和数据表T_USER映射上了,当然除了对象和表名称的对应,还可以做对象元素和字段的对应。


通过这可以做很多业务规则事情,比如日志业务,如果你数据库中是按照月划分日志表的话(像log_01、log_02、log_03等),当前时间是哪个月就插入哪个月的表里情况,你的数据对象就可以只有一个Log对象,封装实现NamingStrategy接口,根据当前月份或天数映射到对应的数据表


 1、自定义一个类MyNamingStrategy来实现NamingStrategy。(这样你要实现10个方法,如果其他方法不需要,我们可以通过继承它的一个适配器类DefaultNamingStrategy来只实现我们需要的方法)好了,我们就继承DefaultNamingStrategy 吧。
  
 2、实现public String classToTableName(String className)方法来实现自己命名策略。


public class MyNameStrategy extends DefaultNamingStrategy{@Overridepublic String classToTableName(String className) {DateFormat format = new SimpleDateFormat("yyyyMM");String currentDate = format.format(new Date());if("AccessLog".equals(className)){return "joye_access_" + currentDate;}}
}



参考文章:

http://zcooke.iteye.com/blog/1611357


http://bbs.csdn.net/topics/390748660?page=1