文章转载自https://blog.csdn.net/OO570741825/article/details/76020525
开发前期我一直使用本机Windows系统建立的数据库,后来将数据库迁到Linux上,使用大写字母建立的表、字段JPA都提示不存在,JPA在后台打印的SQL语句也都是小写的,原来是JPA默认将表名等转换成小写了,研究了下有两种解决方式:
改MySQL的cnf
关闭mysql
修改/etc/my.cnf添加设置
…
[mysqld]
lower_case_table_names=1
…
启动mysql使用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,就可以满足定制化的一些名称处理,如表名加前缀,后缀等等。