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();
Hibernate之创建命名策略的更多相关文章
- Hibernate入门之命名策略(naming strategy)详解
		
前言 JPA和Hibernate都提供了默认映射策略,通过映射将每个实体类映射到具有相同名称的数据库表,它的每个属性都映射到具有相同属性的列, 但是,在实际项目开发中可能出现与默认命名约定不匹配,也就 ...
 - 80.  Hibernate 5.0命名策略使用naming-strategy 不起作用【从零开始学Spring Boot】
		
[原创文章,转载请注明出处] 事情的起因:一不小心从1.3.3升级到了1.4.0版本,结果就碰到了各种悲催的事情了,好吧,Hibernate5.0的新特性就是其中一个坑,我们会发现我们配置的namin ...
 - 攻城狮在路上(壹) Hibernate(三)--- 属性访问、命名策略、派生属性、指定包名等
		
一.hibernate访问持久化类属性的策略: 在<property>元素中的access属性用于指定Hibernate访问持久化类属性的方式. 常见的方式如下: 1.property:默 ...
 - Hibernate命名策略及配置
		
hibernate 表 命名策略 分类: hibernate2013-02-27 18:46464人阅读评论(0)收藏举报 Hibernate注释下的自定义架构实 ...
 - hibernate 命名策略
		
对于Java开发人员,Hibernate 3 annotations提供了非常好的方式来展示域分层.你可以很轻松的通过Hibernate自动生成需要的数据库架构,带有完整的SQL脚本.然而回到现实世界 ...
 - 【spring boot hibernate】hibernate命名策略spring.jpa.hibernate.naming-strategy不起作用
		
对于 spring.jpa.hibernate.naming-strategy = org.hibernate.cfg.ImprovedNamingStrategy hibernate命名策略设置之后 ...
 - 【hibernate】hibernate不同版本的命名策略
		
===================================================hibernate 4命名策略如下================================ ...
 - Hibernate命名策略
		
hibernate的命名策略,可以减少对数据库标识符命名的维护,进一步减少这部份命名的重复性代码量,以提高维护. hibernate的命名方式,有两类,一类是显式命名,一类是隐式命名. 显式命名:在映 ...
 - Hibernate缓存原理与策略
		
Hibernate缓存原理: 对于Hibernate这类ORM而言,缓存显的尤为重要,它是持久层性能提升的关键.简单来讲Hibernate就是对JDBC进行封装,以实现内部状态的管理,OR关系的映射等 ...
 
随机推荐
- Happen-before
			
http://blog.csdn.net/ns_code/article/details/17348313
 - springmvc跳转和重定向
			
如果springmvc返回的视图中带有redirect:或者forward:,springmvc会进行特殊处理, redirect:会执行重定向,forward:会执行转发操作! @RequestMa ...
 - el 中requestScope和param
			
${scope.attribute},其中scope指pageSocpe.requestScope.sessionScope.applicationScope,attribute指的就是你在某个sco ...
 - java和Javascript的区别
			
1 首先,这两个家伙没有任何的血缘关系,java是是由Sun 公司于1995年5月推出的,而javascript是于1995年由Netscape公司设计实现而成的,由于Netscape公司与Sun公司 ...
 - throw和throws的区别
			
1. 作用不同: throw用于在程序中抛出异常;throws用于声明在该方法内抛出异常, 2. 使用位置不同:throw位于方法体内部,可以作为单独语句使用,throws必须跟着 ...
 - web测试一般分为那几个阶段,哪些阶段是可以用工具实现的,都有些什么工具,哪些阶段必须要人工手动来实现呢?
			
这是我在知乎上遇到的一个问题: web测试一般分为那几个阶段,哪些阶段是可以用工具实现的,都有些什么工具,哪些阶段必须要人工手动来实现呢? 首先这个提问本身就是有问题的, 没有哪个阶段是用工具实现的, ...
 - JAVA 多线程和并发学习笔记(一)
			
一.进程与线程 1. 进程 当一个程序进入内存运行时,即变成一个进程.进程是处于运行过程中的程序.进程是操作系统进行资源分配和调度的一个独立单位.进程的三个特征: 独立性 独立存在的实体,每个进程都有 ...
 - web form 基础知识初整理
			
WebForm的基础知识1.(IIS7的标准首页iisstart.htm)ASP.NET 是.NET开发网站应用程序的技术总称 ,有两种方法,1.webform :比如淘宝 2.MVC B/S 一种网 ...
 - oneCMDB
			
OneCMDB开源地址: http://www.oschina.net/p/onecmdb/, 官方网站:http://www.onecmdb.org/wiki/index.php?title=Mai ...
 - eclipse 删除所有注释及空白行
			
Ctrl+F 删除java注释: /\*{1,2}[\s\S]*?\*/ Ctrl+F 删除xml注释: <!-[\s\S]*?--> Ctrl+F 删除空白行: ^\s*\n 选 ...