SpringBoot - 使用JPA,遇到MySQL区分大小写的问题

SpringBoot 专栏收录该内容
1 篇文章 0 订阅

文章转载自https://blog.csdn.net/OO570741825/article/details/76020525

开发前期我一直使用本机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,就可以满足定制化的一些名称处理,如表名加前缀,后缀等等。


  • 1
    点赞
  • 0
    评论
  • 4
    收藏
  • 扫一扫,分享海报

©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值