您的位置:首页 > 其它

Hibernate(三)——Hibernate给表和字段设置前后缀及分隔符

2015-09-21 17:04 357 查看

      在《一口一口吃掉Hibernate(一)——使用SchemaExport生成数据表》中介绍了如何生成数据表。但是这只是最基本的。Hibernate在生成或者操作数据库时,会受一些限制。比如一开始设计表的时候,直接写成了user(id,name,password,createTime)
 这种格式的。但是客户后来要求表名称要以“t_”开头,字段名要以“stu_”开头,可以是一些数据库的关键字,单词之间以“_”隔开,方便他们维护.例如:T_User(stu_Id,stu_Name,stu_Create_Time)。

      对于上面的问题,常规的方法就是去修改Hibernate_cfg.xml中的表,为每个表添加“t_”,或者写table属性,字段也重新使用column属性来修改。如果你有100张表,每个表平均有10个字段,你还会去一个一个修改么?还有可能漏掉或者改错。最“可恶”的是,如果客户再让你改成其他的呢,是不是还要全部修改一次?

      有没有一种方法,不修改原先的配置,添加并配置一下表和字段的前后缀及分隔符等等,既可以完成呢??经过尝试,终于被我拿下了,现在拿出来与大家分享。

      针对上述问题,我主要用的是NamingStrategy接口。这个接口很有意思,可以作为业务类规范和数据库表规范的桥梁,它可以表和列的映射关系的转变和处理。例如一个数据对象User,对应数据库表是T_USER,如果所有映射关系都是这样的情况,可以使用NamingStrategy做为一个桥梁衔接,而不用再hbm.xml映射文件中指定class对应的物理table。

      先说一下Hibernate读取映射文件的简要过程:循环读取class标签,判断class标签的table属性值是否为null,若为null,则调用NamingStrategy接口的classToTableName方法将class值转换并处理(按命名策略NamingStrategy处理)的表名。若不为null,则说明设置了table,那么调用NamingStrategy接口的tableName方法获取处理过的表名。循环遍历property,判断property标签的column属性值是否为null,若为null,则首先调用propertyToColumnName方法,将属性值转化为列名,再调用logicalColumnName方法。若不为null,则直接调用NamingStrategy接口的logicalColumnName方法,再调用columnName方法进行处理(按命名策略NamingStrategy处理)。

      了解了上面说的这个过程,只要我们实现NamingStrategy这个接口,就可以随心所欲的修改表映射了。不多说了,直接上代码吧:

    【MyNamingStrategy】自定义的命名策略,可对表、字段进行统一处理。

[java]
view plaincopyprint?

package com.tgb.hibernate.neatlyDB;  
  
import org.hibernate.cfg.Configuration;  
import org.hibernate.cfg.NamingStrategy;  
import org.hibernate.util.StringHelper;  
  
/** 
 * 数据库命名策略,可定制表、字段等的前后缀 
 *  
 * @author Longxuan 
 *  
 */  
public class MyNamingStrategy implements NamingStrategy {  
  
    /** 
     * 数据库命名策略单一实例 
     */  
    private static MyNamingStrategy instance = null;  
  
    /** 
     * 数据库配置信息类 
     */  
    private static DatabaseConfiguration dbcfg = null;  
  
    /** 
     * 私有化构造方法 
     */  
    private MyNamingStrategy() {  
  
    }  
  
    /** 
     * 使用单利模式,获取数据库命名策略的唯一实例 
     *  
     * @return 
     */  
    public static synchronized MyNamingStrategy getInstance() {  
        // 默认读取hibernate.cfg.xml文件  
        Configuration cfg = new Configuration().configure()
4000
;  
        return getInstance(cfg);  
    }  
  
    /** 
     * 使用单利模式,获取数据库命名策略的唯一实例,同时使用默认Hibernate.cfg.xml更新命名策略信息 
     *  
     * @param cfg 
     *            配置文件信息 
     * @return 
     */  
    public static synchronized MyNamingStrategy getInstance(Configuration cfg) {  
        if (instance == null) {  
            instance = new MyNamingStrategy();  
        }  
        MyNamingStrategy.dbcfg = new DatabaseConfiguration(cfg);  
        return instance;  
    }  
  
    /** 
     * 使用单利模式,获取数据库命名策略的唯一实例,同时更新命名策略信息 
     *  
     * @param cfg 
     *            配置文件信息 
     * @return 
     */  
    public static synchronized MyNamingStrategy getInstance(  
            DatabaseConfiguration dbcfg) {  
        if (instance == null) {  
            instance = new MyNamingStrategy();  
        }  
        MyNamingStrategy.dbcfg = dbcfg;  
        return instance;  
    }  
  
    /** 
     * 设置或更新数据库配置信息 
     *  
     * @param dbcfg 
     */  
    public void setDBConfig(DatabaseConfiguration dbcfg) {  
        MyNamingStrategy.dbcfg = dbcfg;  
    }  
  
    /** 
     * 转化为物理表名 
     *  
     * @param className hbm.xml中的对应表的class值 
     */  
    @Override  
    public String classToTableName(String className) {  
          
        if(className == null ) return null;  
          
        //改变大小写  
        String str =UpdateStyle(className,dbcfg.getTableStyle().name());  
              
        //添加前后缀  
        str = addPrefixORStuffix(str, dbcfg.getTablePrefix(),dbcfg.getTableSuffix());  
          
        //添加分隔符  
        str = addSeparator(str,dbcfg.getTableSeparator());  
          
        return str;  
    }  
  
    @Override  
    public String collectionTableName(String ownerEntity,  
            String ownerEntityTable, String associatedEntity,  
            String associatedEntityTable, String propertyName) {  
        return null;  
    }  
  
      
    /** 
     * 将读取到的列名传递过来进行加工处理,变为物理表的字段名 
     *  
     * @param columnName logicalColumnName方法读取到的列名 
     */  
    @Override  
    public String columnName(String columnName) {  
        //先调用logicalColumnName方法,拿到处理过的值,  
        //再传递到该方法中,所以可以在这两个方法中任一选择修改。         
        //return columnName;  
          
        if(columnName == null ) return null;  
          
        //改变大小写  
        String str =UpdateStyle(columnName,dbcfg.getColumnTyle().name());  
              
        //添加前后缀  
        str = addPrefixORStuffix(StringHelper.unqualify(str), dbcfg.getColumnPrefix(),dbcfg.getColumnSuffix());  
          
        //添加分隔符  
        str = addSeparator(str,dbcfg.getColumnSeparator());  
          
        return str;  
          
    }  
  
      
    /** 
     * 处理外键列名 
     *  
     */  
    @Override  
    public String foreignKeyColumnName(String propertyName,  
            String propertyEntityName, String propertyTableName,  
            String referencedColumnName) {  
          
        if(referencedColumnName == null ) return null;  
          
        //改变大小写  
        String str =UpdateStyle(referencedColumnName,dbcfg.getColumnTyle().name());  
              
        //添加前后缀  
        str = addPrefixORStuffix(StringHelper.unqualify(str), dbcfg.getColumnPrefix(),dbcfg.getColumnSuffix());  
          
        //添加分隔符  
        str = addSeparator(str,dbcfg.getColumnSeparator());  
          
        return str;  
    }  
  
    /** 
     * 关联键的名称 
     */  
    @Override  
    public String joinKeyColumnName(String joinedColumn, String joinedTable) {  
          
        if(joinedColumn == null ) return null;  
          
        //改变大小写  
        String str =UpdateStyle(joinedColumn,dbcfg.getColumnTyle().name());  
              
        //添加前后缀  
        str = addPrefixORStuffix(StringHelper.unqualify(str), dbcfg.getColumnPrefix(),dbcfg.getColumnSuffix());  
          
        //添加分隔符  
        str = addSeparator(str,dbcfg.getColumnSeparator());  
          
        return str;  
    }  
  
    @Override  
    public String logicalCollectionColumnName(String columnName,  
            String propertyName, String referencedColumn) {  
        return null;  
    }  
  
    @Override  
    public String logicalCollectionTableName(String tableName,  
            String ownerEntityTable, String associatedEntityTable,  
            String propertyName) {  
        return null;  
    }  
  
    /** 
     * 处理逻辑列名 
     * <b>若设置了column属性,会直接调用调用该方法</b> 
     *  
     * @param columnName    列名 
     * @param propertyName  实体列名 
     */  
    @Override  
    public String logicalColumnName(String columnName, String propertyName) {  
          
        //name值对应propertyName,column值对应columnName  
        //判断columnName是否设置,若设置了,则返回column值,否则返回propertyName值  
        return columnName == null || columnName =="" ? propertyName:columnName;  
          
    }  
  
    /** 
     * 处理逻辑列名 
     * <b>若未设置column属性,则先调用该方法,再调用logicalColumnName方法</b> 
     *  
     * @param propertyName  实体列名 
     */  
    @Override  
    public String propertyToColumnName(String propertyName) {  
  
        if(propertyName == null ) return null;  
          
        //改变大小写  
        String str =UpdateStyle(propertyName,dbcfg.getColumnTyle().name());  
              
        //添加前后缀  
        str = addPrefixORStuffix(StringHelper.unqualify(str), dbcfg.getColumnPrefix(),dbcfg.getColumnSuffix());  
          
        //添加分隔符  
        str = addSeparator(str,dbcfg.getColumnSeparator());  
          
        return str;  
    }  
  
      
    /** 
     * 处理表名 
     * <b>若设置了table属性,才会调用该方法</b> 
     */  
    @Override  
    public String tableName(String tableName) {  
          
        if(tableName == null ) return null;  
          
        //改变大小写  
        String str =UpdateStyle(tableName,dbcfg.getTableStyle().name());  
              
        //添加前后缀  
        str = addPrefixORStuffix(StringHelper.unqualify(str), dbcfg.getTablePrefix(),dbcfg.getTableSuffix());  
          
        //添加分隔符  
        str = addSeparator(str,dbcfg.getTableSeparator());  
          
        return str;  
    }  
  
    /** 
     * 单词分隔符 
     *  
     * @param name 
     * @return 
     */  
    private String addSeparator(String str, String flag) {  
        StringBuffer buf = new StringBuffer(str.substring(str.lastIndexOf(".")+1));  
        for (int i = 1; i < buf.length() - 1; i++) {  
            if ('_' != buf.charAt(i - 1)  
                    && Character.isUpperCase(buf.charAt(i))  
                    && !Character.isUpperCase(buf.charAt(i + 1))) {  
                // buf.insert(i++, '_');  
                buf.insert(i++, flag);  
            }  
        }  
        return buf.toString();  
    }  
  
    /** 
     * 添加前后缀 
     *  
     * @param str 
     *            字符串 
     * @param prefix 
     *            前缀 
     * @param suffix 
     *            后缀 
     * @return 
     */  
    private String addPrefixORStuffix(String str, String prefix, String suffix) {  
        StringBuffer buf = new StringBuffer(str.substring(str.lastIndexOf(".")+1));  
        buf.insert(buf.length(), suffix).insert(0, prefix);  
        return buf.toString();  
    }  
  
    /** 
     * 更新样式 
     * @param str 
     * @param style 
     * @return 
     */  
    private String UpdateStyle(String str, String style) {        
        if ("AU".equals(style)) {  
            str = str.toUpperCase();  
        } else if ("AL".equals(style)) {  
            str = str.toLowerCase();  
        } else if ("FU".equals(style)) {  
            StringBuffer buf = new StringBuffer(str.substring(str.lastIndexOf(".")+1));  
            String upper =buf.substring(0,1).toUpperCase();  
            buf.delete(0, 1).insert(0, upper);  
            str = buf.toString();  
        } else if ("FL".equals(style)) {  
            StringBuffer buf = new StringBuffer(str.substring(str.lastIndexOf(".")+1));  
            String lower =buf.substring(0,1).toLowerCase();  
            buf.delete(0, 1).insert(0, lower);  
            str = buf.toString();  
        }  else{  
              
        }         
        return str;  
    }  
      
      
}  

package com.tgb.hibernate.neatlyDB;

import org.hibernate.cfg.Configuration;
import org.hibernate.cfg.NamingStrategy;
import org.hibernate.util.StringHelper;

/**
* 数据库命名策略,可定制表、字段等的前后缀
*
* @author Longxuan
*
*/
public class MyNamingStrategy implements NamingStrategy {

/**
* 数据库命名策略单一实例
*/
private static MyNamingStrategy instance = null;

/**
* 数据库配置信息类
*/
private static DatabaseConfiguration dbcfg = null;

/**
* 私有化构造方法
*/
private MyNamingStrategy() {

}

/**
* 使用单利模式,获取数据库命名策略的唯一实例
*
* @return
*/
public static synchronized MyNamingStrategy getInstance() {
// 默认读取hibernate.cfg.xml文件
Configuration cfg = new Configuration().configure();
return getInstance(cfg);
}

/**
* 使用单利模式,获取数据库命名策略的唯一实例,同时使用默认Hibernate.cfg.xml更新命名策略信息
*
* @param cfg
*            配置文件信息
* @return
*/
public static synchronized MyNamingStrategy getInstance(Configuration cfg) {
if (instance == null) {
instance = new MyNamingStrategy();
}
MyNamingStrategy.dbcfg = new DatabaseConfiguration(cfg);
return instance;
}

/**
* 使用单利模式,获取数据库命名策略的唯一实例,同时更新命名策略信息
*
* @param cfg
*            配置文件信息
* @return
*/
public static synchronized MyNamingStrategy getInstance(
DatabaseConfiguration dbcfg) {
if (instance == null) {
instance = new MyNamingStrategy();
}
MyNamingStrategy.dbcfg = dbcfg;
return instance;
}

/**
* 设置或更新数据库配置信息
*
* @param dbcfg
*/
public void setDBConfig(DatabaseConfiguration dbcfg) {
MyNamingStrategy.dbcfg = dbcfg;
}

/**
* 转化为物理表名
*
* @param className hbm.xml中的对应表的class值
*/
@Override
public String classToTableName(String className) {

if(className == null ) return null;

//改变大小写
String str =UpdateStyle(className,dbcfg.getTableStyle().name());

//添加前后缀
str = addPrefixORStuffix(str, dbcfg.getTablePrefix(),dbcfg.getTableSuffix());

//添加分隔符
str = addSeparator(str,dbcfg.getTableSeparator());

return str;
}

@Override
public String collectionTableName(String ownerEntity,
String ownerEntityTable, String associatedEntity,
String associatedEntityTable, String propertyName) {
return null;
}

/**
* 将读取到的列名传递过来进行加工处理,变为物理表的字段名
*
* @param columnName logicalColumnName方法读取到的列名
*/
@Override
public String columnName(String columnName) {
//先调用logicalColumnName方法,拿到处理过的值,
//再传递到该方法中,所以可以在这两个方法中任一选择修改。
//return columnName;

if(columnName == null ) return null;

//改变大小写
String str =UpdateStyle(columnName,dbcfg.getColumnTyle().name());

//添加前后缀
str = addPrefixORStuffix(StringHelper.unqualify(str), dbcfg.getColumnPrefix(),dbcfg.getColumnSuffix());

//添加分隔符
str = addSeparator(str,dbcfg.getColumnSeparator());

return str;

}

/**
* 处理外键列名
*
*/
@Override
public String foreignKeyColumnName(String propertyName,
String propertyEntityName, String propertyTableName,
String referencedColumnName) {

if(referencedColumnName == null ) return null;

//改变大小写
String str =UpdateStyle(referencedColumnName,dbcfg.getColumnTyle().name());

//添加前后缀
str = addPrefixORStuffix(StringHelper.unqualify(str), dbcfg.getColumnPrefix(),dbcfg.getColumnSuffix());

//添加分隔符
str = addSeparator(str,dbcfg.getColumnSeparator());

return str;
}

/**
* 关联键的名称
*/
@Override
public String joinKeyColumnName(String joinedColumn, String joinedTable) {

if(joinedColumn == null ) return null;

//改变大小写
String str =UpdateStyle(joinedColumn,dbcfg.getColumnTyle().name());

//添加前后缀
str = addPrefixORStuffix(StringHelper.unqualify(str), dbcfg.getColumnPrefix(),dbcfg.getColumnSuffix());

//添加分隔符
str = addSeparator(str,dbcfg.getColumnSeparator());

return str;
}

@Override
public String logicalCollectionColumnName(String columnName,
String propertyName, String referencedColumn) {
return null;
}

@Override
public String logicalCollectionTableName(String tableName,
String ownerEntityTable, String associatedEntityTable,
String propertyName) {
return null;
}

/**
* 处理逻辑列名
* <b>若设置了column属性,会直接调用调用该方法</b>
*
* @param columnName	列名
* @param propertyName	实体列名
*/
@Override
public String logicalColumnName(String columnName, String propertyName) {

//name值对应propertyName,column值对应columnName
//判断columnName是否设置,若设置了,则返回column值,否则返回propertyName值
return columnName == null || columnName =="" ? propertyName:columnName;

}

/**
* 处理逻辑列名
* <b>若未设置column属性,则先调用该方法,再调用logicalColumnName方法</b>
*
* @param propertyName	实体列名
*/
@Override
public String propertyToColumnName(String propertyName) {

if(propertyName == null ) return null;

//改变大小写
String str =UpdateStyle(propertyName,dbcfg.getColumnTyle().name());

//添加前后缀
str = addPrefixORStuffix(StringHelper.unqualify(str), dbcfg.getColumnPrefix(),dbcfg.getColumnSuffix());

//添加分隔符
str = addSeparator(str,dbcfg.getColumnSeparator());

return str;
}

/**
* 处理表名
* <b>若设置了table属性,才会调用该方法</b>
*/
@Override
public String tableName(String tableName) {

if(tableName == null ) return null;

//改变大小写
String str =UpdateStyle(tableName,dbcfg.getTableStyle().name());

//添加前后缀
str = addPrefixORStuffix(StringHelper.unqualify(str), dbcfg.getTablePrefix(),dbcfg.getTableSuffix());

//添加分隔符
str = addSeparator(str,dbcfg.getTableSeparator());

return str;
}

/**
* 单词分隔符
*
* @param name
* @return
*/
private String addSeparator(String str, String flag) {
StringBuffer buf = new StringBuffer(str.substring(str.lastIndexOf(".")+1));
for (int i = 1; i < buf.length() - 1; i++) {
if ('_' != buf.charAt(i - 1)
&& Character.isUpperCase(buf.charAt(i))
&& !Character.isUpperCase(buf.charAt(i + 1))) {
// buf.insert(i++, '_');
buf.insert(i++, flag);
}
}
return buf.toString();
}

/**
* 添加前后缀
*
* @param str
*            字符串
* @param prefix
*            前缀
* @param suffix
*            后缀
* @return
*/
private String addPrefixORStuffix(String str, String prefix, String suffix) {
StringBuffer buf = new StringBuffer(str.substring(str.lastIndexOf(".")+1));
buf.insert(buf.length(), suffix).insert(0, prefix);
return buf.toString();
}

/**
* 更新样式
* @param str
* @param style
* @return
*/
private String UpdateStyle(String str, String style) {
if ("AU".equals(style)) {
str = str.toUpperCase();
} else if ("AL".equals(style)) {
str = str.toLowerCase();
} else if ("FU".equals(style)) {
StringBuffer buf = new StringBuffer(str.substring(str.lastIndexOf(".")+1));
String upper =buf.substring(0,1).toUpperCase();
buf.delete(0, 1).insert(0, upper);
str = buf.toString();
} else if ("FL".equals(style)) {
StringBuffer buf = new StringBuffer(str.substring(str.lastIndexOf(".")+1));
String lower =buf.substring(0,1).toLowerCase();
buf.delete(0, 1).insert(0, lower);
str = buf.toString();
}  else{

}
return str;
}

}


【DatabaseConfiguration】数据库样式配置,包括前后缀、分隔符、大小写等

[java]
view plaincopyprint?

package com.tgb.hibernate.neatlyDB;  
  
import org.hibernate.cfg.Configuration;  
  
  
/** 
 * 数据库模式配置 
 * @author Longxuan 
 * 
 */  
public final class DatabaseConfiguration {  
  
  
    /** 
     * 列名样式 
     * AU-all upper case 
     * AL-all lower case 
     * FU-first upper case per word 
     * FL-first lower case ,Other first letter upper case 
     */  
    public static enum ColumnTyle {  
        AU,AL,FU,FL;          
    }  
      
    /** 
     * 表名称样式 
     * AU-all upper case 
     * AL-all lower case 
     * FU-first upper case per word 
     * FL-first lower case ,Other first letter upper case 
     */  
    public static enum TableStyle{  
        AU,AL,FU,FL;  
    }  
  
    /** 
     * 列名样式 
     * AU-all upper case 
     * AL-all lower case 
     * FU-first upper case per word 
     * FL-first lower case ,Other first letter upper case 
     */  
    private ColumnTyle columnTyle = ColumnTyle.FL;  
      
    /** 
     * 表名称样式 
     * AU-all upper case 
     * AL-all lower case 
     * FU-first upper case per word 
     * FL-first lower case ,Other first letter upper case 
     */  
    private TableStyle tableStyle = TableStyle.FU;  
      
    /** 
     * 表名称前缀 
     */  
    private String tablePrefix = "";  
      
    /** 
     * 表名称后缀 
     */  
    private String tableSuffix = "";  
      
    /** 
     * 表名称分隔符 
     */  
    private String tableSeparator = "";  
      
    /** 
     * 列名前缀 
     */  
    private String columnPrefix = "";  
      
    /** 
     * 列名后缀 
     */  
    private String columnSuffix = "";  
      
    /** 
     * 列名分隔符 
     */  
    private String columnSeparator = "";  
      
    public ColumnTyle getColumnTyle() {  
        return columnTyle;  
    }  
  
    public void setColumnTyle(ColumnTyle columnTyle) {  
        this.columnTyle = columnTyle;  
    }  
  
    public TableStyle getTableStyle() {  
        return tableStyle;  
    }  
  
    public void setTableStyle(TableStyle tableStyle) {  
        this.tableStyle = tableStyle;  
    }  
  
    public String getTablePrefix() {  
        return tablePrefix;  
    }  
  
    public void setTablePrefix(String tablePrefix) {  
        this.tablePrefix = tablePrefix;  
    }  
  
    public String getTableSuffix() {  
        return tableSuffix;  
    }  
  
    public void setTableSuffix(String tableSuffix) {  
        this.tableSuffix = tableSuffix;  
    }  
  
    public String getTableSeparator() {  
        return tableSeparator;  
    }  
  
    public void setTableSeparator(String tableSeparator) {  
        this.tableSeparator = tableSeparator;  
    }  
  
    public String getColumnPrefix() {  
        return columnPrefix;  
    }  
  
    public void setColumnPrefix(String columnPrefix) {  
        this.columnPrefix = columnPrefix;  
    }  
  
    public String getColumnSuffix() {  
        return columnSuffix;  
    }  
  
    public void setColumnSuffix(String columnSuffix) {  
        this.columnSuffix = columnSuffix;  
    }  
  
    public String getColumnSeparator() {  
        return columnSeparator;  
    }  
  
    public void setColumnSeparator(String columnSeparator) {  
        this.columnSeparator = columnSeparator;  
    }  
      
  
    /** 
     * 初始化,读取配置参数,默认读取Hibernate.cfg.xml 
     * @param cfg 
     */  
    public DatabaseConfiguration(){  
        ReadConfig(new Configuration().configure());   
    }  
      
    /** 
     * 初始化,读取配置文件 
     * @param cfg 
     */  
    public DatabaseConfiguration(Configuration cfg){  
        ReadConfig(cfg);   
    }  
      
  
    /** 
     * 自动读取配置信息 
     * @param cfg 
     */  
    private void ReadConfig(Configuration cfg){  
        tableStyle = cfg.getProperty("tablestyle")==""?TableStyle.FU:TableStyle.valueOf(cfg.getProperty("tablestyle"));  
        tablePrefix = cfg.getProperty("tablePrefix");  
        tableSuffix = cfg.getProperty("tablesuffix");  
        tableSeparator = cfg.getProperty("tableseparator");  
          
        columnTyle = cfg.getProperty("columntyle")==""?ColumnTyle.FL:ColumnTyle.valueOf(cfg.getProperty("columntyle"));  
        columnPrefix = cfg.getProperty("columnPrefix");  
        columnSuffix = cfg.getProperty("columnsuffix");  
        columnSeparator = cfg.getProperty("columnseparator");  
          
    }  
      
}  

package com.tgb.hibernate.neatlyDB;

import org.hibernate.cfg.Configuration;

/**
* 数据库模式配置
* @author Longxuan
*
*/
public final class DatabaseConfiguration {

/**
* 列名样式
* AU-all upper case
* AL-all lower case
* FU-first upper case per word
* FL-first lower case ,Other first letter upper case
*/
public static enum ColumnTyle {
AU,AL,FU,FL;
}

/**
* 表名称样式
* AU-all upper case
* AL-all lower case
* FU-first upper case per word
* FL-first lower case ,Other first letter upper case
*/
public static enum TableStyle{
AU,AL,FU,FL;
}

/**
* 列名样式
* AU-all upper case
* AL-all lower case
* FU-first upper case per word
* FL-first lower case ,Other first letter upper case
*/
private ColumnTyle columnTyle = ColumnTyle.FL;

/**
* 表名称样式
* AU-all upper case
* AL-all lower case
* FU-first upper case per word
* FL-first lower case ,Other first letter upper case
*/
private TableStyle tableStyle = TableStyle.FU;

/**
* 表名称前缀
*/
private String tablePrefix = "";

/**
* 表名称后缀
*/
private String tableSuffix = "";

/**
* 表名称分隔符
*/
private String tableSeparator = "";

/**
* 列名前缀
*/
private String columnPrefix = "";

/**
* 列名后缀
*/
private String columnSuffix = "";

/**
* 列名分隔符
*/
private String columnSeparator = "";

public ColumnTyle getColumnTyle() {
return columnTyle;
}

public void setColumnTyle(ColumnTyle columnTyle) {
this.columnTyle = columnTyle;
}

public TableStyle getTableStyle() {
return tableStyle;
}

public void setTableStyle(TableStyle tableStyle) {
this.tableStyle = tableStyle;
}

public String getTablePrefix() {
return tablePrefix;
}

public void setTablePrefix(String tablePrefix) {
this.tablePrefix = tablePrefix;
}

public String getTableSuffix() {
return tableSuffix;
}

public void setTableSuffix(String tableSuffix) {
this.tableSuffix = tableSuffix;
}

public String getTableSeparator() {
return tableSeparator;
}

public void setTableSeparator(String tableSeparator) {
this.tableSeparator = tableSeparator;
}

public String getColumnPrefix() {
return columnPrefix;
}

public void setColumnPrefix(String columnPrefix) {
this.columnPrefix = columnPrefix;
}

public String getColumnSuffix() {
return columnSuffix;
}

public void setColumnSuffix(String columnSuffix) {
this.columnSuffix = columnSuffix;
}

public String getColumnSeparator() {
return columnSeparator;
}

public void setColumnSeparator(String columnSeparator) {
this.columnSeparator = columnSeparator;
}

/**
* 初始化,读取配置参数,默认读取Hibernate.cfg.xml
* @param cfg
*/
public DatabaseConfiguration(){
ReadConfig(new Configuration().configure());
}

/**
* 初始化,读取配置文件
* @param cfg
*/
public DatabaseConfiguration(Configuration cfg){
ReadConfig(cfg);
}

/**
* 自动读取配置信息
* @param cfg
*/
private void ReadConfig(Configuration cfg){
tableStyle = cfg.getProperty("tablestyle")==""?TableStyle.FU:TableStyle.valueOf(cfg.getProperty("tablestyle"));
tablePrefix = cfg.getProperty("tablePrefix");
tableSuffix = cfg.getProperty("tablesuffix");
tableSeparator = cfg.getProperty("tableseparator");

columnTyle = cfg.getProperty("columntyle")==""?ColumnTyle.FL:ColumnTyle.valueOf(cfg.getProperty("columntyle"));
columnPrefix = cfg.getProperty("columnPrefix");
columnSuffix = cfg.getProperty("columnsuffix");
columnSeparator = cfg.getProperty("columnseparator");

}

}


【hibernate.cfg.xml】设置数据库样式配置信息

[html]
view plaincopyprint?

<!DOCTYPE hibernate-configuration PUBLIC  
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN"  
    "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">  
  
<hibernate-configuration>  
    <session-factory name="foo">        
<!--   
    name:       配置的名称  
    style:      类型 枚举AU-all upper case  
                      AL-all lower case  
                      FU-first letter upper case per word  
                      FL-first letter lower case ,Other first letters upper case  
      
    befix:      前缀  
    suffix:     后缀  
    separator:  分隔符  
 -->  
        <property name="tablestyle">FU</property>  
        <property name="tablePrefix" >T_</property>  
        <property name="tablesuffix" ></property>  
        <property name="tableseparator" >_</property>         
        <property name="columntyle">FU</property>  
        <property name="columnPrefix">[stu_</property>  
        <property name="columnsuffix">]</property>  
        <property name="columnseparator">_</property>  
          
          
      
        <property name="hibernate.dialect" >org.hibernate.dialect.MySQLDialect</property>  
        <property name="hibernate.show_sql">true</property><!-- 设置是否显示生成sql语句 -->  
        <property name="hibernate.format_sql">false</property><!-- 设置是否格式化sql语句-->  
          
        <mapping resource="com/bjpowernode/hibernate/User.hbm.xml" />  
          
    </session-factory>  
      
</hibernate-configuration>  

<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
<session-factory name="foo">
<!--
name:		配置的名称
style:		类型 枚举AU-all upper case
AL-all lower case
FU-first letter upper case per word
FL-first letter lower case ,Other first letters upper case

befix:		前缀
suffix:		后缀
separator:	分隔符
-->
<property name="tablestyle">FU</property>
<property name="tablePrefix" >T_</property>
<property name="tablesuffix" ></property>
<property name="tableseparator" >_</property>
<property name="columntyle">FU</property>
<property name="columnPrefix">[stu_</property>
<property name="columnsuffix">]</property>
<property name="columnseparator">_</property>

<property name="hibernate.dialect" >org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.show_sql">true</property><!-- 设置是否显示生成sql语句 -->
<property name="hibernate.format_sql">false</property><!-- 设置是否格式化sql语句-->

<mapping resource="com/bjpowernode/hibernate/User.hbm.xml" />

</session-factory>

</hibernate-configuration>


【User.hbm.xml】映射文件可以比较随意的修改或者设定了

[html]
view plaincopyprint?

<?xml version="1.0"?>  
<!DOCTYPE hibernate-mapping PUBLIC   
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
<hibernate-mapping>  
    <class name="com.bjpowernode.hibernate.User" table="Users">  
        <id name="id" column="pid">  
            <generator class="uuid" />  
        </id>  
        <property name="name" column="userName"></property>  
        <property name="password" column="pwd"></property>  
        <property name="createTime"></property>  
        <property name="expireTime"></property>  
          
    </class>  
</hibernate-mapping>  

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.bjpowernode.hibernate.User" table="Users">
<id name="id" column="pid">
<generator class="uuid" />
</id>
<property name="name" column="userName"></property>
<property name="password" column="pwd"></property>
<property name="createTime"></property>
<property name="expireTime"></property>

</class>
</hibernate-mapping>


最后修改一下【ExportDB】,主要是修改必须先设置NamingStrategy,在调用configure方法

[java]
view plaincopyprint?

package com.bjpowernode.hibernate;  
  
import org.hibernate.cfg.Configuration;  
import org.hibernate.tool.hbm2ddl.SchemaExport;  
  
import com.tgb.hibernate.neatlyDB.DatabaseConfiguration;  
import com.tgb.hibernate.neatlyDB.MyNamingStrategy;  
  
  
  
/** 
 * 将hbm生成ddl 
 * @author Longxuan 
 * 
 */  
public class ExportDB {  
  
    /** 
     * @param args 
     */  
    public static void main(String[] args) {  
  
        //默认读取hibernate.cfg.xml文件,并按照命名策略修改表、字段的名称  
        //Configuration cfg = new Configuration().configure();   
          
        //注意,必须先设置NamingStrategy,在调用configure方法  
        Configuration cfg = new Configuration().setNamingStrategy(MyNamingStrategy.getInstance()).configure();  
                          
        SchemaExport export = new SchemaExport(cfg);  
          
        //true 在控制台打印ddl语句,true 导入ddl语句到数据库,即可执行  
        export.create(true, true);  
    }  
  
}  

package com.bjpowernode.hibernate;

import org.hibernate.cfg.Configuration;
import org.hibernate.tool.hbm2ddl.SchemaExport;

import com.tgb.hibernate.neatlyDB.DatabaseConfiguration;
import com.tgb.hibernate.neatlyDB.MyNamingStrategy;

/**
* 将hbm生成ddl
* @author Longxuan
*
*/
public class ExportDB {

/**
* @param args
*/
public static void main(String[] args) {

//默认读取hibernate.cfg.xml文件,并按照命名策略修改表、字段的名称
//Configuration cfg = new Configuration().configure();

//注意,必须先设置NamingStrategy,在调用configure方法
Configuration cfg = new Configuration().setNamingStrategy(MyNamingStrategy.getInstance()).configure();

SchemaExport export = new SchemaExport(cfg);

//true 在控制台打印ddl语句,true 导入ddl语句到数据库,即可执行
export.create(true, true);
}

}

      看一下结果图吧:表名,字段名都已经修改过了。



      上面演示的是生成数据表。在对数据库的增删改查时,只要同样设置NamingStrategy即可。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: