升级Spring Boot3.x后Hibernate6的@Type注解失效问题
解决Hibernate 6中Y/N字符串转Java布尔值的问题
在Hibernate 6(随Spring Boot 3.x升级)中,原Hibernate 5的@Type(type = "yes_no")用法已被废弃,@Type注解不再接受字符串参数,因此会出现"Cannot resolve method 'type'"的错误。以下是几种可行的解决方案:
方案1:使用Hibernate内置的YesNoConverter
直接用Hibernate提供的YesNoConverter转换器,专门处理数据库CHAR类型的Y/N与Java布尔值的映射:
import org.hibernate.type.YesNoConverter; import jakarta.persistence.Column; import jakarta.persistence.Convert; // ... @Column(name = "IS_SPECIAL") @Convert(converter = YesNoConverter.class) private Boolean isSpecial;
方案2:全局配置默认布尔类型映射
如果数据库中有大量Y/N格式的布尔列,可以通过全局配置统一处理,无需给每个字段加注解:
application.properties
spring.jpa.properties.hibernate.type.preferred_boolean_jdbc_type=CHAR spring.jpa.properties.hibernate.type.char.boolean_to_yes_no=true
application.yml
spring: jpa: properties: hibernate: type: preferred_boolean_jdbc_type: CHAR char: boolean_to_yes_no: true
配置后,所有Java布尔类型字段都会自动映射为数据库中的Y/N字符串列。
方案3:自定义转换器(可选)
如果需要更灵活的自定义逻辑,也可以自己实现AttributeConverter:
import jakarta.persistence.AttributeConverter; import jakarta.persistence.Converter; @Converter(autoApply = true) // autoApply=true表示全局生效,不需要每个字段加@Convert public class BooleanToYesNoConverter implements AttributeConverter<Boolean, String> { @Override public String convertToDatabaseColumn(Boolean attribute) { return attribute != null && attribute ? "Y" : "N"; } @Override public Boolean convertToEntityAttribute(String dbData) { return "Y".equalsIgnoreCase(dbData); } }
如果不需要全局生效,去掉autoApply=true,然后在字段上添加@Convert(converter = BooleanToYesNoConverter.class)即可。
内容的提问来源于stack exchange,提问作者Arun Gowda
相关产品推荐
相关产品推荐

