在开发软件时,通常会要求每个开发人员遵守共同的命名策略。例如,数据库的表名及字段名的所有字符都要大写,表名以“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();

Hibernate之创建命名策略的更多相关文章

  1. Hibernate入门之命名策略(naming strategy)详解

    前言 JPA和Hibernate都提供了默认映射策略,通过映射将每个实体类映射到具有相同名称的数据库表,它的每个属性都映射到具有相同属性的列, 但是,在实际项目开发中可能出现与默认命名约定不匹配,也就 ...

  2. 80. Hibernate 5.0命名策略使用naming-strategy 不起作用【从零开始学Spring Boot】

    [原创文章,转载请注明出处] 事情的起因:一不小心从1.3.3升级到了1.4.0版本,结果就碰到了各种悲催的事情了,好吧,Hibernate5.0的新特性就是其中一个坑,我们会发现我们配置的namin ...

  3. 攻城狮在路上(壹) Hibernate(三)--- 属性访问、命名策略、派生属性、指定包名等

    一.hibernate访问持久化类属性的策略: 在<property>元素中的access属性用于指定Hibernate访问持久化类属性的方式. 常见的方式如下: 1.property:默 ...

  4. Hibernate命名策略及配置

    hibernate 表 命名策略         分类:            hibernate2013-02-27 18:46464人阅读评论(0)收藏举报 Hibernate注释下的自定义架构实 ...

  5. hibernate 命名策略

    对于Java开发人员,Hibernate 3 annotations提供了非常好的方式来展示域分层.你可以很轻松的通过Hibernate自动生成需要的数据库架构,带有完整的SQL脚本.然而回到现实世界 ...

  6. 【spring boot hibernate】hibernate命名策略spring.jpa.hibernate.naming-strategy不起作用

    对于 spring.jpa.hibernate.naming-strategy = org.hibernate.cfg.ImprovedNamingStrategy hibernate命名策略设置之后 ...

  7. 【hibernate】hibernate不同版本的命名策略

    ===================================================hibernate 4命名策略如下================================ ...

  8. Hibernate命名策略

    hibernate的命名策略,可以减少对数据库标识符命名的维护,进一步减少这部份命名的重复性代码量,以提高维护. hibernate的命名方式,有两类,一类是显式命名,一类是隐式命名. 显式命名:在映 ...

  9. Hibernate缓存原理与策略

    Hibernate缓存原理: 对于Hibernate这类ORM而言,缓存显的尤为重要,它是持久层性能提升的关键.简单来讲Hibernate就是对JDBC进行封装,以实现内部状态的管理,OR关系的映射等 ...

随机推荐

  1. Happen-before

    http://blog.csdn.net/ns_code/article/details/17348313

  2. springmvc跳转和重定向

    如果springmvc返回的视图中带有redirect:或者forward:,springmvc会进行特殊处理, redirect:会执行重定向,forward:会执行转发操作! @RequestMa ...

  3. el 中requestScope和param

    ${scope.attribute},其中scope指pageSocpe.requestScope.sessionScope.applicationScope,attribute指的就是你在某个sco ...

  4. java和Javascript的区别

    1 首先,这两个家伙没有任何的血缘关系,java是是由Sun 公司于1995年5月推出的,而javascript是于1995年由Netscape公司设计实现而成的,由于Netscape公司与Sun公司 ...

  5. throw和throws的区别

    1.      作用不同: throw用于在程序中抛出异常;throws用于声明在该方法内抛出异常, 2.      使用位置不同:throw位于方法体内部,可以作为单独语句使用,throws必须跟着 ...

  6. web测试一般分为那几个阶段,哪些阶段是可以用工具实现的,都有些什么工具,哪些阶段必须要人工手动来实现呢?

    这是我在知乎上遇到的一个问题: web测试一般分为那几个阶段,哪些阶段是可以用工具实现的,都有些什么工具,哪些阶段必须要人工手动来实现呢? 首先这个提问本身就是有问题的, 没有哪个阶段是用工具实现的, ...

  7. JAVA 多线程和并发学习笔记(一)

    一.进程与线程 1. 进程 当一个程序进入内存运行时,即变成一个进程.进程是处于运行过程中的程序.进程是操作系统进行资源分配和调度的一个独立单位.进程的三个特征: 独立性 独立存在的实体,每个进程都有 ...

  8. web form 基础知识初整理

    WebForm的基础知识1.(IIS7的标准首页iisstart.htm)ASP.NET 是.NET开发网站应用程序的技术总称 ,有两种方法,1.webform :比如淘宝 2.MVC B/S 一种网 ...

  9. oneCMDB

    OneCMDB开源地址: http://www.oschina.net/p/onecmdb/, 官方网站:http://www.onecmdb.org/wiki/index.php?title=Mai ...

  10. eclipse 删除所有注释及空白行

    Ctrl+F 删除java注释:  /\*{1,2}[\s\S]*?\*/ Ctrl+F 删除xml注释:  <!-[\s\S]*?--> Ctrl+F 删除空白行:   ^\s*\n 选 ...