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

最近正在开发基于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,就可以满足定制化的一些名称处理,如表名加前缀,后缀等等。

你可能感兴趣的:(spring-boot)