在开发软件时,通常会要求每个开发人员遵守共同的命名策略。例如,数据库的表名及字段名的所有字符都要大写,表名以“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. 解决ftp连接出现 无法从控制 Socket 读取。Socket 错误 = #10054。

    ftp连接会显示以下错误信息 无法从控制 Socket 读取.Socket 错误 = #10054 或者是这样的信息 Opening data channel for directory list.T ...

  2. 【Python与机器学习】:利用Keras进行多类分类

    多类分类问题本质上可以分解为多个二分类问题,而解决二分类问题的方法有很多.这里我们利用Keras机器学习框架中的ANN(artificial neural network)来解决多分类问题.这里我们采 ...

  3. union select

    union select 联合查询 ,即合并(取交集,结果中没有重复行)前后两个查询:前提是前后查询视图必须拥有相同数量的列,列也必需拥有相同的数据类型. union all select 则取的是两 ...

  4. case语句

    case语句是多分支选择语句,if语句只有两个分支可供选择,而实际问题中常常需要用到多分支选择结构.例如,学生成绩分类(90分以上为A,--):人口统计分类(按年龄分为老.中.青.少.幼)等.当然这些 ...

  5. Django model 中meta options

    之前学了abstract,这是后续的一些options app_label: app_label的作用是:如果一个model定义不在INSTALLED_APPS中,那么此时就需要声明,这个model的 ...

  6. 简单实用的Windows命令(一)

    前几天新买了一台笔记本电脑,使用了一下几个简单的查看电脑配置的命令,觉得非常的不错,在此记录一下 一:运行命令的方式有两种 1:使用快捷键WIN+R,然后在弹出的“运行”对话框中输入对应的命令 2:在 ...

  7. perl脚本基础总结

    1.  单引号字符串中的\n不会被当做换行符处理. 如:'\'\\'  -->  '\  . 2.  双引号 字符串联    "Hello"."World" ...

  8. 简单来谈谈alloc分配器

    之前说道alloc是原G2.9版本的默认的分配器,这篇就把alloc的原理梳理梳理,顺便简单介绍下有关的内存管理. 一般而言,我们通常习惯的内存分配操作和释放操作是这样的: class Foo {…} ...

  9. Python TCP服务器

    TCP服务器的创建也比较简单: 1.建立一个socket对象 2.绑定要监听的IP地址和端口 3.当有客户端请求时,启动多线程处理客户端连接 import socket import threadin ...

  10. NHibernate系列文章一:NHibernate介绍

    摘要 NHibernate是一个成熟的开源的面向对象的.net映射框架.大量的实际项目中正在使用该框架.他是建立在ADO.Net基础之上.目前的版本是NHibernate 4.0.4.本系列文章都是基 ...