Hibernate 6.3.1.Final适配MariaDB枚举类型注解问题求助
Hibernate 6.3.1.Final对接遗留数据库枚举类型适配方案
问题描述
- 数据库以
int(11)存储枚举时,Hibernate抛出“expecting #TINYINT”错误,修改@Column的columnDefinition为INTEGER或int2无效,且无法修改数据库列类型(避免破坏遗留代码) - 数据库以
varchar(255)存储枚举时,使用@Enumerated(EnumType.STRING)注解,出现“found [varchar (Types#VARCHAR)], but expecting [enum ('active','inactive') (Types#ENUM)]”验证错误 - 以上问题在Hibernate 6.0.1.Final中未出现
枚举类代码
import java.util.HashMap; import java.util.Map; public enum ActiveOrInactive { Active, Inactive; static final Map<String, ActiveOrInactive> _activeOrInactive = new HashMap<String, ActiveOrInactive>(); static { for (ActiveOrInactive activeOrInactive : ActiveOrInactive.values()) { _activeOrInactive.put(activeOrInactive.toString(), activeOrInactive); } } public static Map<String, ActiveOrInactive> getPublishedStateTypes() { return _activeOrInactive; } }
原JPA字段配置示例
@Column(name = "status", nullable = false) @Enumerated(EnumType.STRING) @Basic(optional=false) private ActiveOrInactive status;
解决方案
1. 适配int(11)存储的枚举
Hibernate 6.3+对数值型枚举的映射校验更严格,默认会将其映射为TINYINT。要适配int(11),需显式指定列类型并关闭该字段的类型校验:
@Column(name = "status", nullable = false, columnDefinition = "int(11)") @Enumerated(EnumType.ORDINAL) @Basic(optional = false) @Type(parameters = @Parameter(name = "disable_type_check", value = "true")) private ActiveOrInactive status;
全局适配方案(所有数值枚举生效):在
application.properties中添加配置hibernate.type.enum.ordinal.disable_type_check=true
2. 适配varchar(255)存储的枚举
Hibernate 6.3+默认会将字符串枚举映射为数据库原生ENUM类型,而遗留库使用的是VARCHAR。需显式指定列类型并关闭类型校验:
@Column(name = "status", nullable = false, columnDefinition = "varchar(255)") @Enumerated(EnumType.STRING) @Basic(optional = false) @Type(parameters = @Parameter(name = "disable_type_check", value = "true")) private ActiveOrInactive status;
全局适配方案(所有字符串枚举生效):在
application.properties中添加配置hibernate.type.enum.string.disable_type_check=true
内容的提问来源于stack exchange,提问作者user2989397
相关产品推荐
相关产品推荐

