You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 10:07:34