如何配置JPA使其创建/使用PostgreSQL的segment_type枚举?
解决JPA自动创建PostgreSQL枚举名称不匹配的问题
问题原因
Hibernate自动生成数据库枚举类型时,默认会把Java枚举类名SegmentType转换为小写连写的segmenttype,但你需要的是下划线分隔的segment_type,导致类型名称不匹配触发报错。
解决方案
方法1:给枚举类添加注解指定数据库枚举名称
在Java枚举类上通过@TypeDef明确指定数据库中对应的枚举类型名:
import org.hibernate.annotations.TypeDef; import org.hibernate.annotations.Parameter; import org.hibernate.type.descriptor.jdbc.PostgreSQLEnumJdbcType; @TypeDef( name = "segment_type", typeClass = PostgreSQLEnumJdbcType.class, parameters = @Parameter(name = "enumName", value = "segment_type") ) public enum SegmentType { SEG1, SEG2 }
之后在实体类的字段上,用@Type引用这个自定义类型:
@Entity(name = "entity_segments") public class EntitySegment { @Id @Column(name = "my_id") private UUID myId; @Column(name = "segment_type", columnDefinition = "segment_type") @ColumnDefault("'SEG1'") @Enumerated(EnumType.STRING) @Type("segment_type") SegmentType segmentType = SegmentType.SEG1; }
方法2:全局配置枚举命名策略(多枚举场景适用)
如果有多个枚举需要统一使用下划线命名规则,可在配置文件中添加Hibernate属性:
- 若使用
application.properties:
hibernate.hbm2ddl.extra_physical_table_types=ENUM hibernate.type.enum.naming_strategy=underscore
- 若使用
application.yml:
hibernate: hbm2ddl: extra_physical_table_types: ENUM type: enum: naming_strategy: underscore
该配置会让Hibernate自动将Java枚举的驼峰名称转换为下划线分隔的数据库枚举名称(如SegmentType→segment_type)。
验证
禁用Flyway后启动服务,检查PostgreSQL数据库是否生成了segment_type枚举类型,同时实体字段能正确关联该类型,即可解决报错问题。
内容的提问来源于stack exchange,提问作者DaHoC
相关产品推荐
相关产品推荐

