spring boot 1.5.4使用JPA,遇到Mysql区分大小写的问题

来源:互联网 发布:2017517网络加速器官网 编辑:程序博客网 时间:2024/06/15 17:14

最近正在开发基于Spring Boot框架的应用,遇到了Mysql区分大小写的问题。

开发前期我一直使用本机Windows系统建立的数据库,后来将数据库迁到Linux上,使用大写字母建立的表、字段JPA都提示不存在,JPA在后台打印的SQL语句也都是小写的,原来是JPA默认将表名等转换成小写了,研究了下有两种解决方式:

  1. 改MySQL的cnf
    关闭mysql
    修改/etc/my.cnf添加设置

    [mysqld]
    lower_case_table_names=1

    启动mysql

  2. 使用PhysicalNamingStrategy
    Spring Boot1.5.4 JPA是基于hibernate5.0的,有两种现成的方式实现PhysicalNamingStrategy

    • org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl 无修改的
    • org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy 有修改,Spirng Boot 1.5.4默认使用SpringPhysicalNamingStrategy ,会处理添加“-”,会将表、字段名转化为小写
      application.yml中配置使用PhysicalNamingStrategy,就没有字段被小写的问题了
spring:  jpa:    hibernate:      naming:        physical-strategy:  org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
  • 自定义实现PhysicalNamingStrategy
    比如你想使用SpringPhysicalNamingStrategy ,又想命名不被转化为小写,可以自定义实现自己的逻辑,像SpringPhysicalNamingStrategy 中isCaseInsensitive方法是用来指定数据库是否区分大小写,但并未实现。
protected Identifier getIdentifier(String name, boolean quoted,JdbcEnvironment jdbcEnvironment) {        if (isCaseInsensitive(jdbcEnvironment)) {            name = name.toLowerCase(Locale.ROOT);        }        return new Identifier(name, quoted);}protected boolean isCaseInsensitive(JdbcEnvironment jdbcEnvironment) {        return true;}

这边就可以继承SpringPhysicalNamingStrategy,重新isCaseInsensitive方法将返回值改为false,满足SpringPhysicalNamingStrategy规则也不会将表名等转化成小写:

public class MySQLUpperCaseStrategy extends SpringPhysicalNamingStrategy {    @Override    protected boolean isCaseInsensitive(JdbcEnvironment jdbcEnvironment) {        return false;    }}

自己实现PhysicalNamingStrategy,就可以满足定制化的一些名称处理,如表名加前缀,后缀等等。

原创粉丝点击