hibernate 命名策略

来源:互联网 发布:网络大电影摄影收入 编辑:程序博客网 时间:2024/04/28 00:22
在Java对象里面, 偶们知道一个良好的命名规范会采用大写单词的首字母, 比如订单项这个对象, 偶们会起名为OrderItem, 这样很容易就看出来这个对象是由Order和Item 2个单词组成的, 断词就很容易了, 而属性也是如此, 比如maxPrice, totalPrice等等.但是如果按照同样的命名规范运到数据库的时候, 由于很多数据库对于表名, 字段名是大小写不敏感的, 所以最常见的策略是加下划线作为断词的依据:OrderItem -> order_itemmaxPrice -> max_price这样运用Hibernate的时候, 偶们就得手工在mapping文件里面指明:<class name="OrderItem" table="order_item"><property name="maxPrice" column="max_price"/>每个mapping关系都得手工这样写, 是不是很不爽? 现在来介绍一下net.sf.hibernate.cfg.NamingStrategy的用处, 看看它是怎么修理这个问题的, 代码如下:Java代码 1.import net.sf.hibernate.cfg.NamingStrategy; 2.import net.sf.hibernate.util.StringHelper; 3.  4./** 5.* An improved naming strategy that prefers embedded underscores to mixed case6.* names, base on DefaultNamingStrategy and ImprovedNamingStrategy7.* 8.*/  9.   10.public class UnderscoreNamingStrategyimplements NamingStrategy {  11.  12.    public staticfinal NamingStrategy INSTANCE = new UnderscoreNamingStrategy();;  13.  14.    protected UnderscoreNamingStrategy(); { 15.    }  16.  17.    public String classToTableName(String className); { 18.        return addUnderscores(StringHelper.unqualify(className););; 19.    }  20.  21.    public String propertyToColumnName(String propertyName); { 22.        return addUnderscores(StringHelper.unqualify(propertyName););; 23.    }  24.  25.    public String tableName(String tableName); { 26.        return tableName;  27.    }  28.  29.    public String columnName(String columnName); { 30.        return columnName;  31.    }  32.  33.    public String propertyToTableName(String className, String propertyName); { 34.        return classToTableName(className); +'_' + propertyToColumnName(propertyName);; 35.    }  36.  37.    private String addUnderscores(String name); { 38.        StringBuffer buf = new StringBuffer(name.replace('.','_'););;  39.        for (int i =1; i < buf.length(); - 1; i++); { 40.            if ('_' != buf.charAt(i -1); && Character.isUpperCase(buf.charAt(i);); && !Character.isUpperCase(buf.charAt(i +1););); {  41.                buf.insert(i++, '_');; 42.            }  43.        }  44.        return buf.toString();.toLowerCase();; 45.    }  46.  47.}  import net.sf.hibernate.cfg.NamingStrategy;import net.sf.hibernate.util.StringHelper;/** * An improved naming strategy that prefers embedded underscores to mixed case * names, base on DefaultNamingStrategy and ImprovedNamingStrategy *  */ public class UnderscoreNamingStrategy implements NamingStrategy {    public static final NamingStrategy INSTANCE = new UnderscoreNamingStrategy();;    protected UnderscoreNamingStrategy(); {    }    public String classToTableName(String className); {        return addUnderscores(StringHelper.unqualify(className););;    }    public String propertyToColumnName(String propertyName); {        return addUnderscores(StringHelper.unqualify(propertyName););;    }    public String tableName(String tableName); {        return tableName;    }    public String columnName(String columnName); {        return columnName;    }    public String propertyToTableName(String className, String propertyName); {        return classToTableName(className); + '_' + propertyToColumnName(propertyName);;    }    private String addUnderscores(String name); {        StringBuffer buf = new StringBuffer(name.replace('.', '_'););;        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++, '_');;            }        }        return buf.toString();.toLowerCase();;    }} 在初始化配置的时候, 把这个NamingStrategy加上:Java代码 1.Configuration config = new Configuration();; 2.config.setNamingStrategy(UnderscoreNamingStrategy.INSTANCE);;      Configuration config = new Configuration();;    config.setNamingStrategy(UnderscoreNamingStrategy.INSTANCE);; 这样mapping文件就变得简单多了:<class name="OrderItem"><property name="maxPrice"/>NamingStrategy还可以用在其他方面, 比如有些数据库设计规范统一要求Table前面加上模块名称 (如, 属于Order模块的统一加上ORDER_ ), 比如还有些恶心规范统一要求表名和字段名采用4码缩写 (如, OrderItem -> orde_item, maxPrice -> max_pric), 这些都是NamingStrategy可以解决的脏活累活.


 

原创粉丝点击