大小写不同的实体属性无法全生成MySQL列的问题排查与解决咨询
首先,这个问题的核心矛盾在于MySQL默认的列名大小写不敏感特性,和你业务中需要区分大小写属性的需求冲突了——Hibernate/JPA本身是支持区分大小写的属性映射,但数据库这边会把大小写不同的列名视为同一个,所以才会出现只生成部分列的情况。
问题根源
MySQL的lower_case_table_names系统参数决定了数据库对象(表、列)名的大小写处理规则:
0:区分大小写,数据库对象名严格按照创建时的大小写存储和比较1:不区分大小写,所有对象名转为小写存储,查询时也转为小写比较(Windows系统默认值)2:存储时保留大小写,但比较时转为小写(Linux系统默认值)
你的场景中,MySQL应该是使用了不区分大小写的配置,所以FirstName、fIRStName、FIRSTName会被视为同一个列,最终只生成了一个。
解决步骤
1. 调整MySQL的大小写敏感配置
首先需要修改MySQL的my.cnf(Linux)或my.ini(Windows)配置文件,设置:
lower_case_table_names=0
修改后需要重启MySQL服务才能生效。注意:这个修改会影响所有数据库对象的大小写处理,如果你有现有数据库,需要确保它们的对象名不会因为大小写问题出现冲突。
2. 显式指定每个属性的列名
在你的Lombok @Data实体类中,使用JPA的@Column注解显式指定每个属性对应的数据库列名,确保Hibernate生成的列名和你需要的大小写完全一致:
@Data @Entity public class AtQueryEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(name = "FirstName", nullable = false) private String firstName; @Column(name = "fIRStName", nullable = false) private String fIRStName; @Column(name = "FIRSTName", nullable = false) private String FIRSTName; }
这里的nullable = false对应你JSON中required: true的配置。
3. 验证Hibernate命名策略
确保你的Hibernate配置没有强制修改列名的大小写。比如Spring Boot中,如果你使用了spring.jpa.hibernate.naming.physical-strategy,避免使用会强制转小写的策略;或者保持默认的org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy,配合@Column显式指定列名即可覆盖默认行为。
补充说明
Hibernate/JPA本身并不限制区分大小写的属性映射——Java语言本身是区分大小写的,所以实体类中不同大小写的属性会被视为不同的字段。问题出在数据库层面的大小写不敏感配置,导致多个列名被合并成一个。只要调整好MySQL的配置并显式指定列名,就能生成你需要的所有列。
内容的提问来源于stack exchange,提问作者Santosh Pandey

