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{
@Override
public String classToTableName(String className) {
// TODO Auto-generated method stub
return tableName(StringHelper.unqualify(className).toUpperCase());
}
@Override
public String columnName(String columnName) {
// TODO Auto-generated method stub
return columnName;
}
@Override
public String propertyToColumnName(String propertyName) {
// TODO Auto-generated method stub
return propertyName.toUpperCase();
}
@Override
public String propertyToTableName(String className, String propertyName) {
// TODO Auto-generated method stub
return classToTableName(className) + '_' + propertyToColumnName(propertyName);
}
@Override
public String tableName(String tableName) {
// TODO Auto-generated method stub
return "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接口,根据当前月份映射到对应的数据表。
小小的功能可以实现的业务场景还有很多,不妨多想想。