为什么Ubuntu 20.04环境下Spring Batch连接MySQL生成小写表名
问题原因
- 重复建表触发:你同时开启了数据库初始化自动执行自定义SQL和Spring Batch自带的自动建表功能:你自己的
schema-mysql.sql执行生成了大写开头的BATCH_*表,Spring Batch默认执行的自带建表脚本生成了小写开头的batch_*表,所以出现两套重复表。 - Linux下MySQL大小写规则:Ubuntu环境的MySQL默认
lower_case_table_names参数值为0,即对表名大小写敏感,建表时如果没有特殊配置,不同脚本的大小写命名会被识别为不同的表。 - 若你项目集成了Hibernate/JPA,默认的命名策略会自动将实体映射的表名转为全小写格式,也会额外生成小写表。
解决方案(使用自定义SQL中的大写表名)
- 关闭Spring Batch自动建表功能,在
application.properties中添加如下配置,避免框架自动执行自带的建表脚本:
spring.batch.jdbc.initialize-schema=never
- 手动指定Spring Batch操作的表前缀为大写,避免框架查询时找不到大写表:
spring.batch.jdbc.table-prefix=BATCH_
- 若集成了Hibernate/JPA,添加如下配置关闭自动建表、保留SQL中定义的大小写:
spring.jpa.hibernate.ddl-auto=none spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
- 如需MySQL全局保留表名大小写,可修改MySQL配置文件
/etc/mysql/mysql.conf.d/mysqld.cnf,在[mysqld]节点下添加配置后重启MySQL服务:
lower_case_table_names=0
注意:
lower_case_table_names参数建议在MySQL初始化安装时设置,若现有库已存数据,修改前请提前备份全量数据,避免原有表无法访问。
- 清空当前
spring库中所有重复的Spring Batch相关表,重启应用即可仅生成你自定义SQL中定义的大写表。
内容的提问来源于stack exchange,提问作者AndreaNobili
相关产品推荐
相关产品推荐

