Spring Boot 3.2.1升级后枚举字段Schema校验错误问题
问题解决:Spring Boot 3.2.1枚举字段Schema校验错误
问题原因
升级Spring Boot到3.2.1并切换javax.persistence到jakarta.persistence后,Hibernate 6.x(Spring Boot 3.x默认依赖)对MySQL枚举类型的映射行为发生了变化:
- 旧版Hibernate 5.x中,
@Enumerated(EnumType.STRING)默认将枚举映射为MySQL的VARCHAR类型 - Hibernate 6.x默认会将该注解的枚举映射为MySQL原生
ENUM类型,而你的数据库中cui_queue表的status列仍是VARCHAR,因此触发Schema校验不匹配错误。
解决方案
方案1:指定实体类字段的列类型为VARCHAR
直接在枚举字段的@Column注解中明确指定列类型为VARCHAR,覆盖Hibernate的默认行为:
@Enumerated(EnumType.STRING) @Column(name = "status", columnDefinition = "VARCHAR(50)") private CuiDocumentStatus status;
方案2:全局禁用原生ENUM映射
通过配置文件全局设置Hibernate对所有枚举都使用VARCHAR类型,无需修改每个实体类:
- application.properties:
spring.jpa.properties.hibernate.type.enum.use_native_enum=false
- application.yml:
spring: jpa: properties: hibernate: type: enum: use_native_enum: false
方案3:修改数据库列类型为MySQL ENUM
如果希望改用数据库原生ENUM类型,执行以下SQL语句修改列结构(注意枚举值要与Java枚举常量名一致):
ALTER TABLE cui_queue MODIFY COLUMN status ENUM('WAIT', 'WORK', 'LOCK') NOT NULL;
若你的JPA命名策略配置为小写转换,需将枚举值改为'wait','work','lock'以匹配Hibernate的期望
内容的提问来源于stack exchange,提问作者Jitin Kumar
相关产品推荐
相关产品推荐

