转自:https://cloud.tencent.com/info/2a609d1995e3e7db80c24fd5367d1f67.html

这几天在用spring boot开发项目, 在开发的过程中遇到一个问题hibernate在执行sql时,总会提示表不存在。

寻找之后发现, 建表时,表统一采用了大写。hibernate会把大写统一转换成小写。且 mysql在 linux下 大小写敏感。

解决:

1. 尝试修改mysql的cnf文件,改成不区分大小写。修改完成之后发现问题并没有解决,还产生了新的问题,表名无论大小写都失败了。

2. 数据库层面修改没有效果, 表结构和表名不能修改,那只能通过代码实现来解决此问题了。

先感谢  三个博主提供的资料

 

地址一   http://blog.csdn.net/q979076061/article/details/51539960

地址二   http://blog.csdn.net/jackyxwr/article/details/8618908

地址三   http://blog.csdn.net/qinshijangshan/article/details/53444499

 

第一篇和第二篇  博客给我提供了很好的思路,然后就照着去实践, hibernate 5之前 默认的命名定义策略使用的是 org.hibernate.cfg.ImprovedNamingStrategy 这个类。上面博客说的很清楚这里就不赘述了。想要自定义命名策略 直接集成此类,在此类上扩展就好了。

代码编写完成之后, 配置之后,并没有如愿以偿的解决了问题。思路很正确,只能顺着接着找了。 看到第三篇博客之后发现自己哪里有问题了, hibernate在5.1版本之后对此作了修改

引用第三篇博客原文:

 

原来是Hibernate5.1相关配置变了。

参考:http://412887952-qq-com.iteye.com/blog/2315686

参考:http://stackoverflow.com/questions/32165694/spring-hibernate-5-naming-strategy-configuration

hibernate.ejb.naming_strategy将不再被支持,而是被替换成了两个属性:
hibernate.physical_naming_strategy
hibernate.implicit_naming_strategy

对于physical_naming_strategy有两个常用的配置:

1
2
org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy  
org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

对于PhysicalNamingStrategyStandardImpl有DefaultNamingStrategy的效果,对于SpringPhysicalNamingStrategy有ImprovedNamingStrategy的效果。

 

经过查看这两个类的源码之后, 发现上面的思路依旧是可以的下面是我的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import org.hibernate.boot.model.naming.Identifier;
import org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl;
import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment;
import org.springframework.stereotype.Component;
 
 
@Component
public class MySQLUpperCaseStrategy extends PhysicalNamingStrategyStandardImpl {
 
    private static final long serialVersionUID = 1383021413247872469L;
 
     
    @Override
    public Identifier toPhysicalTableName(Identifier name, JdbcEnvironment context) {
        // 将表名全部转换成大写
        String tableName = name.getText().toUpperCase();
         
        return name.toIdentifier(tableName);
    }
 
}

 

yml的配置:

1
2
3
4
   #配置hibernate的命名策略
    hibernate:
     naming:
        physical-strategy: com.XX.XX.common.MySQLUpperCaseStrategy

 

经过测试,终于解决此问题。

 

posted on 2018-03-26 17:53  Sharpest  阅读(735)  评论(0编辑  收藏  举报