Hibernate 6.2:Java枚举与Postgres枚举映射报错求助
Postgres枚举与Java枚举映射报错解决方案
问题场景
- 技术栈:Spring Boot 3.1.0 + Spring Data(Hibernate 6.2) + Postgres 14.4.0 + io.hypersistence:hypersistence-utils-hibernate-62:3.5.1
- Postgres枚举定义:
CREATE TYPE event_type AS ENUM ('usercreated', 'userupdated', 'userdeleted');
- Java枚举:
public enum EventType { usercreated, userupdated, userdeleted }
- 初始实体映射代码:
@Enumerated(EnumType.STRING) @Column(name = "event_type", nullable = false) @Type(PostgreSQLEnumType.class) private EventType eventType;
错误信息
Caused by: org.hibernate.MappingException: Unable to determine SQL type name for column 'event_type' of table 'user_updates' at org.hibernate.mapping.Column.getSqlTypeName(Column.java:281) at org.hibernate.mapping.Column.getSqlType(Column.java:339) at org.hibernate.tool.schema.internal.ColumnDefinitions.hasMatchingType(ColumnDefinitions.java:28) at org.hibernate.tool.schema.internal.AbstractSchemaValidator.validateColumnType(AbstractSchemaValidator.java:163) at org.hibernate.tool.schema.internal.AbstractSchemaValidator.validateTable(AbstractSchemaValidator.java:152) at org.hibernate.tool.schema.internal.GroupedSchemaValidatorImpl.validateTables(GroupedSchemaValidatorImpl.java:46) at org.hibernate.tool.schema.internal.AbstractSchemaValidator.performValidation(AbstractSchemaValidator.java:97) at org.hibernate.tool.schema.internal.AbstractSchemaValidator.doValidation(AbstractSchemaValidator.java:75) at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.performDatabaseAction(SchemaManagementToolCoordinator.java:293) at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.lambda$process$5(SchemaManagementToolCoordinator.java:143) at java.base/java.util.HashMap.forEach(HashMap.java:1421) at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.process(SchemaManagementToolCoordinator.java:140) at org.hibernate.boot.internal.SessionFactoryObserverForSchemaExport.sessionFactoryCreated(SessionFactoryObserverForSchemaExport.java:37) at org.hibernate.internal.SessionFactoryObserverChain.sessionFactoryCreated(SessionFactoryObserverChain.java:35) at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:291) at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:431) at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1455) at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:66) at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:376) at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:409) ... 25 common frames omitted Caused by: org.hibernate.HibernateException: No type mapping for org.hibernate.type.SqlTypes code: 1111 (OTHER) at org.hibernate.type.descriptor.sql.spi.DdlTypeRegistry.getTypeName(DdlTypeRegistry.java:205) at org.hibernate.type.descriptor.sql.spi.DdlTypeRegistry.getTypeName(DdlTypeRegistry.java:184) at org.hibernate.mapping.Column.getSqlTypeName(Column.java:277) ... 44 common frames omitted
解决方案
1. 移除冲突注解
@Enumerated(EnumType.STRING)与@Type(PostgreSQLEnumType.class)存在冲突,后者专门用于处理Postgres原生枚举,无需保留前者。
2. 显式指定列的SQL类型
在@Column注解中添加columnDefinition,明确该列对应Postgres的枚举类型名称:
@Column(name = "event_type", nullable = false, columnDefinition = "event_type") @Type(PostgreSQLEnumType.class) private EventType eventType;
3. 确认Hibernate方言配置
确保Spring Boot配置中使用正确的Postgres方言,Hibernate 6推荐配置:
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQL10Dialect
4. 提前创建Postgres枚举类型
Hibernate不会自动生成Postgres枚举类型,需手动在数据库中执行创建语句:
CREATE TYPE event_type AS ENUM ('usercreated', 'userupdated', 'userdeleted');
内容的提问来源于stack exchange,提问作者Ali Behzadian Nejad
相关产品推荐
相关产品推荐

