• Hibernate之创建命名策略


           在开发软件时,通常会要求每个开发人员遵守共同的命名策略。例如,数据库的表名及字段名的所有字符都要大写,表名以“S”结尾。对于Customer类,对应的数据库表名为CUSTOMERS。为了在映射文件中遵守这种命名约定,一种方法是手工设置表名和字段名,但是这种方式很耗时,而且容易出错。还有一种方式是实现Hibernate的org.hibernate.cfg.NamingStrategy接口。对于这一接口,Hibernate已经提供了两个参考实现类:

           ① org.hibernate.cfg.DefaultNamingStrategy类:这是NamingStrategy接口的默认实现类。

           ② org.hibernate.cfg.ImprovedNamingStrategy类:这是NamingStategy接口的高级实现类。

          自定义的实现类可以继承以上两个参考实现类之一,然后覆盖其中的部分方法,如:

    package mypack;
    import org.hibernate.cfg.ImprovedNamingStrategy;
    import org.hibernate.util.StringHelper;
    public class MyNamingStategy extends ImprovedNamingStrategy{
    
    //unqualify()是hiberante中StringHelper类提供的方法,参数为雷鸣,返回值是不带包名的类名
    public String classToTableName(String className){ return StringHelper.unqualify(className).toUpperCase()+'S'; } public String propertyToColumnName(String propertyName){ return propertyName.toUpperCase(); } 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); } }

           MyNamingStrategy类继承了ImprovedNamingStrategy类,并覆盖了它的部分方法。MyNamingStrategy类提供了把类名映射为表名的两个方法.
          (1)classToTableName(String className)方法:如果在<class>元素中没有显示设置表名,Hibernate调用该方法。对于以下映射代码:

             <class name="mypack.Dictionary">

           hibernate会自动调用classToTableName()方法,参数为"mypack.Dictionary",返回的表名为"DICTIONARYS".

           (2)tableName(String tableName):如果在<class>元素中显示设置了表名,Hibernate调用该方法,对于以下的映射代码:

            <class name="mypack.Dictionary" table="DICTIONARIES">

            hibernate会自动调用tableName()方法,参数为"DICTIONARIES",返回的表名仍然是"DICTIONARIES".

           MyNamingStrategy类还提供了把类的属性名映射为字段名的两个方法。

           (1)propertyToColumnName(String propertyName)方法:如果在<property>元素中没有显示设置字段名,Hibernate调用该方法,对于以下映射代码:

            <property name="orderNumber"/>

            hibernate会自动调用propertyToColumnName()方法,参数为"orderNumber"返回的字段名为"ORDERNUMBER".

            (2)columnName(String columnName):如果在<property>元素中显示设置了字段名,Hibernate调用该方法。对于以下映射代码:

            <property name="orderNumber" column="ORDER_NUMBER"/>

            hibernate会自动调用columnName()方法,参数为"ORDER_NUMBER",返回的字段名仍然是"ORDER_NUMBER".

            为了让Hibernate采用以上命名方案,需要在Hibernate初始化阶段设置Configuration对象的NamingStrategy属性,代码如下:

    Configuration config = new Configuration()
      .setNamingStrategy(new MyNamingStrategy())
      .configure();
    SessionFactory sessionFactory = config.buildSessionFactory();

          通常,在NamingStrategy的ClassToTableName()和propertyToColumnName()方法中定义从类名到表名,以及从属性名到字段名的默认命名规则。如果在某些情况下需要覆盖默认命名规则,只需在映射文件中显示指定表名或者字段名,此时会调用tableName()或者columnName()方法。
          在多用户环境中,如果每隔用户需要不同的数据库命名策略,但是共享同样的关系数据模型,无须修改映射文档,只要为每个用户分配一个SessionFactory对象,各自使用单独的命名策略。如以下程序中创建了两个SessionFactory对象:sessionFactory1和sessionFactory2,他们使用的命名策略分别为NamingStrategy1和NamingStrategy2,这两个类都实现了NamingStrategy接口。

    //sessionFactory1采用NamingStrategy1命名策略
    
    Configuration config1 = new Configuration() .setNamingStrategy(new NamingStrategy1()) .configure(); SessionFactory sessionFactory1 = config1.buildSessionFactory(); //sessionFactory2采用NamingStrategy2命名策略 Configuration config2 = new Configuration() .setNamingStrategy(new NamingStrategy2()) .configure(); SessionFactory sessionFactory2 = config2.buildSessionFactory();

     

  • 相关阅读:
    redis分布式锁练习【我】
    自己写了个简单的redis分布式锁【我】
    高并发下的幂等策略分析
    Unity原厂讲师大解密
    Unity3D 多人协作开发 环境搭建 笔记(场景合并)
    Uni2D Unity4.3 2D Skeletal Animation
    2D Skeletal Animation Ready
    Unity Editor类常用方法
    右键菜单 GenericMenu
    Unity Editor Toolbar 编辑器扩展
  • 原文地址:https://www.cnblogs.com/wangyong/p/Hibernate.html
Copyright © 2020-2023  润新知