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

求助:Hibernate 6下通过hbm.xml实现Java枚举与PostgreSQL枚举映射

解决Hibernate 6 + hbm.xml 配置PostgreSQL枚举映射问题

方案一:使用适配Hibernate 6的hibernate-types库

  1. 升级依赖:确保使用专门适配Hibernate 6的hibernate-types-60系列依赖,比如Maven配置:
<dependency>
    <groupId>com.vladmihalcea</groupId>
    <artifactId>hibernate-types-60</artifactId>
    <version>2.21.1</version> <!-- 选择最新稳定版本 -->
</dependency>
  1. 修正hbm.xml配置:
    • 移除enumClass参数值的多余引号(原配置中"my-java-enum-type"的引号是错误写法,直接填写枚举的全限定类名)
    • 确认类型全类名在Hibernate 6下未发生变更,该类型仍位于com.vladmihalcea.hibernate.type.basic包下

调整后的配置示例:

<property name="type" column="Type" access="field">
    <type name="com.vladmihalcea.hibernate.type.basic.PostgreSQLEnumType">
        <param name="enumClass">com.yourpackage.YourEnumType</param>
        <param name="useNamed">true</param>
    </type>
</property>
  1. 可选补充配置:如果配置后仍不生效,在hibernate.cfg.xml中显式注册该自定义类型:
<mapping type="com.vladmihalcea.hibernate.type.basic.PostgreSQLEnumType"/>

方案二:使用Hibernate 6原生枚举类型支持

Hibernate 6原生增强了对PostgreSQL枚举的支持,无需依赖第三方库即可实现映射:

<property name="type" column="Type" access="field">
    <type name="org.hibernate.type.EnumType">
        <param name="enumClass">com.yourpackage.YourEnumType</param>
        <!-- 指定数据库类型为PostgreSQL枚举 -->
        <param name="type">pg_enum</param>
        <!-- 使用枚举名称而非序号值存储 -->
        <param name="useNamed">true</param>
    </type>
</property>

关键注意事项

  • 确保数据库中已创建对应的PostgreSQL枚举类型,示例SQL:CREATE TYPE your_enum AS ENUM ('VALUE1', 'VALUE2');
  • Java枚举的取值名称必须与PostgreSQL枚举的定义完全一致(大小写敏感,需严格匹配)
  • 确认Hibernate配置中hibernate.dialect设置为PostgreSQL方言,比如org.hibernate.dialect.PostgreSQLDialect或更高版本的衍生方言

内容的提问来源于stack exchange,提问作者Milad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 19:31:21