Hibernate修改命名策略
2019独角兽企业重金招聘Python工程师标准>>>
解决思路:
1、解决关键字问题;
2、解决大小写敏感的问题。
首先解决第一个问题,这里有几种方式
(1)将表名或字段名用方括号([])括起来
XML
<property name="context" type="string" >
<column name="[CONTEXT]" length="255" not-null="true" />
</property>
注解
@Column(name = "[CONTEXT]", nullable = false)
private String context;
(2)将表名或字段名用双引号(")括起来
XML
<property name="context" type="string" >
<column name='"CONTEXT"' length="255" not-null="true" />
</property>
注解
@Column(name = "\"CONTEXT\"", nullable = false)
private String context;
解决了第一个问题之后我们再来解决第二个问题,由于Hibernate默认讲所有表名、字段名都转换成小写字母,所以经过转换之后的SQL语句类似于SELECT obj."context" FROM obj;这样的SQL在Oracle中运行也有问题,而SELECT OBJ."CONTEXT" FROM OBJ;这样的SQL运行就问题,所以就需要解决Hibernate大小写的问题,Hibernate控制表名和字段名大小写的配置类为org.hibernate.cfg.ImprovedNamingStrategy,所以我们现在要重写Hibernate的命名策略。
总共需要两个步骤:
(1)写一个替代Hibernate默认命名规则类
package com.xjj.framework.hibernate.cfg;import java.io.Serializable;
import java.util.Locale;import org.hibernate.AssertionFailure;
import org.hibernate.cfg.ImprovedNamingStrategy;
import org.hibernate.cfg.NamingStrategy;
import org.hibernate.internal.util.StringHelper;public class DMNamingStrategy extends ImprovedNamingStrategy implementsNamingStrategy, Serializable {/*** A convenient singleton instance*/public static final NamingStrategy INSTANCE = new DMNamingStrategy();/*** Return the unqualified class name, mixed case converted to* underscores*/@Overridepublic String classToTableName(String className) {return addUnderscores( StringHelper.unqualify(className) );}/*** Return the full property path with underscore seperators, mixed* case converted to underscores*/@Overridepublic String propertyToColumnName(String propertyName) {return addUnderscores( StringHelper.unqualify(propertyName) );}/*** Convert mixed case to underscores*/@Overridepublic String tableName(String tableName) {return addUnderscores(tableName);}/*** Convert mixed case to underscores*/@Overridepublic String columnName(String columnName) {return addUnderscores(columnName);}protected static String addUnderscores(String name) {StringBuilder buf = new StringBuilder( name.replace('.', '_') );for (int i=1; i<buf.length()-1; i++) {if (Character.isLowerCase( buf.charAt(i-1) ) &&Character.isUpperCase( buf.charAt(i) ) &&Character.isLowerCase( buf.charAt(i+1) )) {buf.insert(i++, '_');}}return buf.toString().toUpperCase(Locale.ROOT);}@Overridepublic String collectionTableName(String ownerEntity, String ownerEntityTable, String associatedEntity, String associatedEntityTable,String propertyName) {return tableName( ownerEntityTable + '_' + propertyToColumnName(propertyName) );}/*** Return the argument*/@Overridepublic String joinKeyColumnName(String joinedColumn, String joinedTable) {return columnName( joinedColumn );}/*** Return the property name or propertyTableName*/@Overridepublic String foreignKeyColumnName(String propertyName, String propertyEntityName, String propertyTableName, String referencedColumnName) {String header = propertyName != null ? StringHelper.unqualify( propertyName ) : propertyTableName;if (header == null) throw new AssertionFailure("NamingStrategy not properly filled");return columnName( header ); //+ "_" + referencedColumnName not used for backward compatibility}/*** Return the column name or the unqualified property name*/@Overridepublic String logicalColumnName(String columnName, String propertyName) {return StringHelper.isNotEmpty( columnName ) ? columnName : StringHelper.unqualify( propertyName );}/*** Returns either the table name if explicit or* if there is an associated table, the concatenation of owner entity table and associated table* otherwise the concatenation of owner entity table and the unqualified property name*/@Overridepublic String logicalCollectionTableName(String tableName,String ownerEntityTable, String associatedEntityTable, String propertyName) {if ( tableName != null ) {return tableName;}else {//use of a stringbuffer to workaround a JDK bugreturn new StringBuffer(ownerEntityTable).append("_").append(associatedEntityTable != null ?associatedEntityTable :StringHelper.unqualify( propertyName )).toString();}}/*** Return the column name if explicit or the concatenation of the property name and the referenced column*/@Overridepublic String logicalCollectionColumnName(String columnName, String propertyName, String referencedColumn) {return StringHelper.isNotEmpty( columnName ) ?columnName :StringHelper.unqualify( propertyName ) + "_" + referencedColumn;}
}
基本上是将ImprovedNamingStrategy类拷贝过来并修改addUnderscores方法的返回值为toUpperCase即可。
(2)将命名策略配置到Hibernate的SessionFactory初始化配置上
由于我们公司是使用spring-boot来进行开发的,所以这里给出spring-boot的配置,是经过验证的,XML配置尚未经过验证,配错了我不背锅哦。
spring-boot 1.3.8版本配置
spring.jpa.hibernate.naming_strategy: com.xjj.framework.hibernate.cfg.DMNamingStrategy
spring-boot 1.4.0以上版本的配置
spring.jpa.hibernate.naming.physical-strategy=com.xjj.framework.hibernate.cfg.DMNamingStrategy
详见:http://docs.spring.io/spring-boot/docs/1.4.0.RELEASE/reference/html/howto-data-access.html#howto-configure-jpa-properties
XML方式配置
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"><property name="dataSource" ref="dataSource" /><property name="namingStrategy" ref="namingStrategy" />
</bean>
以上就是解决这个问题的方案了。
参考:
1、http://blog.csdn.net/xt0916020331/article/details/49905949
2、https://my.oschina.net/moks/blog/292740
转载于:https://my.oschina.net/u/1469930/blog/863391
Hibernate修改命名策略相关推荐
- 【转】Hibernate入门之命名策略(naming strategy)详解
前言 JPA和Hibernate都提供了默认映射策略,通过映射将每个实体类映射到具有相同名称的数据库表,它的每个属性都映射到具有相同属性的列, 但是,在实际项目开发中可能出现与默认命名约定不匹配,也就 ...
- 不同的Hibernate命名策略
本文讨论了hibernate提供的不同命名策略,以及命名策略从hibernate 4中的hibernate.ejb.naming_strategy到hibernate 5中的hibernate.imp ...
- Spring Data JPA 从入门到精通~Naming命名策略详解及其实践
Naming 命名策略详解及其实践 用 JPA 离不开 @Entity 实体,我都知道实体里面有字段映射,而字段映射的方法有两种: 显式命名:在映射配置时,设置的数据库表名.列名等,就是进行显式命名, ...
- 64.JPA命名策略【从零开始学Spring Boot】
[从零开始学习Spirng Boot-常见异常汇总] 在(39.2). Spring Boot Shiro权限管理[从零开始学Spring Boot] 这一章节中有人碰到这样一个问题"导入的 ...
- Hibernate第三讲:Hibernate主键策略和Hibernate的查询方案
一. Hibernate主键策略 主键:在关系数据库中,主键用来标识记录并保证每条记录的唯一性(一般可保证全数据库唯一).必须满足以下条件: 1)不允许为空. 2)不允许主键值重复. 3)主键值不允 ...
- Hibernate的检索策略
Hibernate的Session在加载一个Java对象时,可以将与这个对象相关联的其他Java对象都加载到缓存中,以便程序及时调用.但有些情况下,我们不需要加载太多无用的对象到缓存中,一来这样会撑爆 ...
- Hibernate 修改数据
Hibernate 修改数据 2 使用 HQL方式来更新 在 这里修改 Person 的name 和age 通过 id 标识 Session currentSession = H3Utils.getC ...
- Office 365组命名策略 - 补充
博客地址:http://blog.csdn.net/FoxDave 管理超驰控制 被选择的管理员是可以凌驾于这些策略的,横跨所有组的工作负荷和端点,因此这些管理员可以使用屏蔽词去创建组.下面是不被策略 ...
- python批量修改图像像素,修改命名,二值化,划分数据集
目录 修改命名 批量修改文件夹下面所有图片的像素 批量二值化 修改命名 是直接在源文件夹下面修改的 所以记得提前复制下文件再 处理. #-----------------------------批量重 ...
最新文章
- ipvsadm使用简介
- mysql修改字段类型为smallint_mysql更新 unsigned 的 smallint 类型字段出现65535
- python程序员在公司都是做什么的-在一家公司呆了 10 年的程序员,最后都怎么了?...
- maven jdk 版本配置
- ASP.NET MVC Beta 新特性之 IValueProvider
- c语言 java高并发_Java高并发解决方式 2019.docx
- 2014 Multi-University Training Contest 1 — D. Task
- (转)Spring Boot(三):Spring Boot 中 Redis 的使用
- Spring Boot整合 Thymeleaf 模板引擎
- 相关性模型 之 皮尔逊相关系数与斯皮尔曼相关系数
- Unity-lambda表达式
- SAR图像滤波方法比较与分析
- 局域网怎么修改其它计算机ip,电脑局域网怎么更改ip
- 管理后台登入万能密码合集
- 查看html代码来下载mp4视频的一次记录
- 电脑桌面的计算机图标都不见了,如何解决电脑桌面的图标都不见了的问题
- Winfrom 桌面弹窗拦截 关闭进程简易程序 源代码下载
- [slove]Unable to find required classes (javax.activation.DataHandler and javax.m
- java表白_java实现七夕表白神器
- 红孩儿编辑器的渲染子系统的渲染模块的函数依赖关系图
热门文章
- python基因差异分析_差异基因
- CAD2019软件安装教程
- 需求分析的过程是什么?_7大需求分析方法与5大分析过程
- deepin终端编译c程序_C/C++知识点之Ubuntu / Debian / Deepin等 Sublime Text 3 配置C++环境(一键编译运行,格式化代码)...
- python2.7.3怎么安装_python2.7.3的安装
- ios13文件连接服务器教程,iOS 13/iPad OS迈向生产力的一大步,SMB文件共享视频图文教程...
- 软考高项之沟通与干系人管理-背诵记忆
- Java高并发编程:取消和关闭
- 宝塔php安装那个合_通过宝塔面板一键搭建wordpress博客
- python 常量_python学习丨变量与常量