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修改命名策略相关推荐

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

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

  2. 不同的Hibernate命名策略

    本文讨论了hibernate提供的不同命名策略,以及命名策略从hibernate 4中的hibernate.ejb.naming_strategy到hibernate 5中的hibernate.imp ...

  3. Spring Data JPA 从入门到精通~Naming命名策略详解及其实践

    Naming 命名策略详解及其实践 用 JPA 离不开 @Entity 实体,我都知道实体里面有字段映射,而字段映射的方法有两种: 显式命名:在映射配置时,设置的数据库表名.列名等,就是进行显式命名, ...

  4. 64.JPA命名策略【从零开始学Spring Boot】

    [从零开始学习Spirng Boot-常见异常汇总] 在(39.2). Spring Boot Shiro权限管理[从零开始学Spring Boot] 这一章节中有人碰到这样一个问题"导入的 ...

  5. Hibernate第三讲:Hibernate主键策略和Hibernate的查询方案

    一. Hibernate主键策略 主键:在关系数据库中,主键用来标识记录并保证每条记录的唯一性(一般可保证全数据库唯一).必须满足以下条件: 1)不允许为空. 2)不允许主键值重复.  3)主键值不允 ...

  6. Hibernate的检索策略

    Hibernate的Session在加载一个Java对象时,可以将与这个对象相关联的其他Java对象都加载到缓存中,以便程序及时调用.但有些情况下,我们不需要加载太多无用的对象到缓存中,一来这样会撑爆 ...

  7. Hibernate 修改数据

    Hibernate 修改数据 2 使用 HQL方式来更新 在 这里修改 Person 的name 和age 通过 id 标识 Session currentSession = H3Utils.getC ...

  8. Office 365组命名策略 - 补充

    博客地址:http://blog.csdn.net/FoxDave 管理超驰控制 被选择的管理员是可以凌驾于这些策略的,横跨所有组的工作负荷和端点,因此这些管理员可以使用屏蔽词去创建组.下面是不被策略 ...

  9. python批量修改图像像素,修改命名,二值化,划分数据集

    目录 修改命名 批量修改文件夹下面所有图片的像素 批量二值化 修改命名 是直接在源文件夹下面修改的 所以记得提前复制下文件再 处理. #-----------------------------批量重 ...

最新文章

  1. ipvsadm使用简介
  2. mysql修改字段类型为smallint_mysql更新 unsigned 的 smallint 类型字段出现65535
  3. python程序员在公司都是做什么的-在一家公司呆了 10 年的程序员,最后都怎么了?...
  4. maven jdk 版本配置
  5. ASP.NET MVC Beta 新特性之 IValueProvider
  6. c语言 java高并发_Java高并发解决方式 2019.docx
  7. 2014 Multi-University Training Contest 1 — D. Task
  8. (转)Spring Boot(三):Spring Boot 中 Redis 的使用
  9. Spring Boot整合 Thymeleaf 模板引擎
  10. 相关性模型 之 皮尔逊相关系数与斯皮尔曼相关系数
  11. Unity-lambda表达式
  12. SAR图像滤波方法比较与分析
  13. 局域网怎么修改其它计算机ip,电脑局域网怎么更改ip
  14. 管理后台登入万能密码合集
  15. 查看html代码来下载mp4视频的一次记录
  16. 电脑桌面的计算机图标都不见了,如何解决电脑桌面的图标都不见了的问题
  17. Winfrom 桌面弹窗拦截 关闭进程简易程序 源代码下载
  18. [slove]Unable to find required classes (javax.activation.DataHandler and javax.m
  19. java表白_java实现七夕表白神器
  20. 红孩儿编辑器的渲染子系统的渲染模块的函数依赖关系图

热门文章

  1. python基因差异分析_差异基因
  2. CAD2019软件安装教程
  3. 需求分析的过程是什么?_7大需求分析方法与5大分析过程
  4. deepin终端编译c程序_C/C++知识点之Ubuntu / Debian / Deepin等 Sublime Text 3 配置C++环境(一键编译运行,格式化代码)...
  5. python2.7.3怎么安装_python2.7.3的安装
  6. ios13文件连接服务器教程,iOS 13/iPad OS迈向生产力的一大步,SMB文件共享视频图文教程...
  7. 软考高项之沟通与干系人管理-背诵记忆
  8. Java高并发编程:取消和关闭
  9. 宝塔php安装那个合_通过宝塔面板一键搭建wordpress博客
  10. python 常量_python学习丨变量与常量