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关系的映射等 ...
随机推荐
- zen coding和emmet
zen coding 改名为 emmet http://emmet.io/download/
- 【解决】SharePoint集成模式下Reporting Service—为用户授予的权限不足,无法执行此操作。 (rsAccessDenied)
环境:Windows Server 2008 R2 SP1,SharePoint 2010 企业版,SQL Server 2008 R2 Reporting Service(SharePoint集成模 ...
- Python从题目中学习:random() module
最近在给公司培训Python,布置了一道题: ----------------------------------------------------------------------------- ...
- js实现右侧的分享效果
就是当鼠标移到上面的时候,他会出现,鼠标移出就消失. nmouseover和nmouseout就能实现 <style> *{padding:0;margin:0;} #s1{width:2 ...
- 【T电商】 maven初识
PS:本篇博客,就是对于maven的一个简单的总结,认识.可能更多的是借鉴别人的看法,然后结合自己的使用,再加以说明. 首先,什么是maven: Apache Maven is a software ...
- SQL笔记-第五章,函数
一.数学函数 功能 函数名 用法 绝对值 ABS() 指数 POWER() POWER(FWeight,-0.5) 平方根 SQRT() 求随机数 RAND() 舍入到最 ...
- Python之路【第十七篇】:Django【进阶篇 】
Python之路[第十七篇]:Django[进阶篇 ] Model 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接 ...
- CString转换成char*
CString转换成char* :charSource = (char*)strSource.GetBuffer(0); 法2:charSource = (char*)strSource.GetBuf ...
- css设置中文字体(font-family:"黑体")后样式失效问题
做项目时偶遇的一诡异问题,同样的代码,在ff和IE7以上页面显示正常,但IE6无论怎么改都不起作用,本来以为是IE6的某些浮动bug所致,结果弄了很长时间也不行,后来不经意间把原来设定的font-fa ...
- jquery validate ajax submit form
when the jquery validation plugin is used for validating the form data, such as below: html code: &l ...