使用JPA Hibernate时数据库及表名首字母未大写的问题求解
解决Hibernate创建数据库/表名首字母未大写的问题
问题根源
- 数据库层面:MariaDB/SQL Server默认会将未加引号的标识符(数据库名、表名)转换为小写(MariaDB受
lower_case_table_names参数控制,SQL Server默认不区分大小写但存储为小写)。 - Hibernate命名策略:默认的
PhysicalNamingStrategyStandardImpl不会自动将实体类名转换为首字母大写的格式,且不会为标识符添加引号强制保留大小写。
具体解决步骤
一、处理数据库名大小写
针对MariaDB
- 修改数据库配置(需重启服务):
- 找到
my.cnf(Linux)或my.ini(Windows),添加/修改参数:lower_case_table_names=0注意:该参数必须在数据库初始化前设置,若已创建数据库,需先删除再重启服务生效。设置后数据库会严格区分标识符大小写,创建时的大小写会被保留。
- 找到
- 手动创建数据库(无需修改配置):
先通过SQL命令创建带大小写的数据库(用反引号包裹名称):
然后修改JDBC URL,去掉CREATE DATABASE `QLCHTT`;createDatabaseIfNotExist=true:<property name="javax.persistence.jdbc.url" value="jdbc:mariadb://localhost:3306/QLCHTT"/>
针对SQL Server
SQL Server默认不区分标识符大小写,但存储时会转为小写。需在创建数据库/表时用方引号包裹名称,或修改数据库的排序规则为区分大小写(如SQL_Latin1_General_CP1_CS_AS)。
二、处理表名首字母大写
方法1:全局自定义物理命名策略
创建一个自定义的命名策略类,继承PhysicalNamingStrategyStandardImpl,重写表名转换逻辑:
import org.hibernate.boot.model.naming.Identifier; import org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl; import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment; public class CustomPhysicalNamingStrategy extends PhysicalNamingStrategyStandardImpl { @Override public Identifier toPhysicalTableName(Identifier name, JdbcEnvironment context) { // 将逻辑名称的首字母转为大写,其余保持不变 String tableName = name.getText(); if (tableName.length() > 0) { tableName = Character.toUpperCase(tableName.charAt(0)) + tableName.substring(1); } return Identifier.toIdentifier(tableName); } }
然后在persistence.xml中替换原有的命名策略配置:
<property name="hibernate.physical_naming_strategy" value="com.yourpackage.CustomPhysicalNamingStrategy"/>
方法2:在实体类上显式指定表名
如果实体类数量不多,可直接在每个实体类上用@Table注解指定大写的表名:
@Entity @Table(name = "User") public class User { // ... 实体字段 }
三、验证配置
修改后,设置hibernate.hbm2ddl.auto为create(或create-drop),重启程序,即可看到数据库和表名首字母保持大写。
内容的提问来源于stack exchange,提问作者Sky Herobrine
相关产品推荐
相关产品推荐

