Spring Boot Kotlin中PostgreSQL枚举类型映射问题解决
PostgreSQL自定义枚举与Kotlin枚举映射问题解决方案
核心问题
JPA默认会将Kotlin枚举转换为character varying类型存入数据库,但你的PostgreSQL列定义的是自定义枚举role_type,类型不匹配导致报错。以下是可行的解决步骤:
1. 正确实现AttributeConverter
确保转换器准确在Kotlin枚举与数据库枚举字符串之间转换:
import javax.persistence.AttributeConverter import javax.persistence.Converter @Converter(autoApply = true) class RoleConverter : AttributeConverter<Role, String> { override fun convertToDatabaseColumn(attribute: Role?): String? { return attribute?.name } override fun convertToEntityAttribute(dbData: String?): Role? { return dbData?.let { Role.valueOf(it) } } }
2. 配置Hibernate识别PostgreSQL枚举
使用Hibernate的PostgresEnumType来处理数据库端的自定义枚举类型,需要在实体类上添加类型定义:
import org.hibernate.annotations.Type import org.hibernate.annotations.TypeDef import javax.persistence.* @TypeDef( name = "pgsql_enum", typeClass = org.hibernate.type.PostgresEnumType::class ) @Entity @Table(name = "employee") class Employee { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) var id: Long? = null // 明确指定列的数据库类型为自定义枚举role_type @Column(name = "role", columnDefinition = "role_type") // 关联自定义的枚举类型映射 @Type(type = "pgsql_enum") var role: Role? = null // 其他字段... }
3. 关键注意事项
- 移除之前添加的
@Enumerated注解,它会与自定义转换器/类型处理冲突。 - 确保项目依赖中包含
hibernate-core(Spring Boot项目默认已引入),PostgresEnumType属于Hibernate核心类。 @Column的columnDefinition必须准确填写数据库自定义枚举的名称(这里是role_type),不能省略。
内容的提问来源于stack exchange,提问作者Draško
相关产品推荐
相关产品推荐

