PostgreSQL jsonb结合JPA属性转换器报错求助
解决PostgreSQL JSONB列JPA属性转换器导致的
Types: 1936628443错误 这个错误我之前也碰到过,核心原因是你的属性转换器没有明确告诉Hibernate要转换到PostgreSQL的JSONB类型,导致Hibernate默认用了一个自定义的Object类型码(1936628443),而PostgreSQL驱动完全不认识这个类型,所以抛出了Nieznana wartość Types(未知类型值)的异常。
下面是具体的解决步骤:
1. 修改属性转换器,明确指定SQL类型
你的转换器应该实现AttributeConverter<String, Object>,但关键是要指定对应的SQL类型为JSONB。如果是Hibernate 6+,可以重写getSqlType方法;如果是旧版本,就在实体字段上明确列定义。
Hibernate 6+ 版本示例:
import jakarta.persistence.AttributeConverter; import jakarta.persistence.Converter; import org.hibernate.type.SqlTypes; @Converter(autoApply = true) public class JsonbToStringConverter implements AttributeConverter<String, Object> { @Override public Object convertToDatabaseColumn(String attribute) { // 直接返回字符串,Hibernate会自动适配为JSONB格式 return attribute; } @Override public String convertToEntityAttribute(Object dbData) { return dbData != null ? dbData.toString() : null; } // 重点:指定SQL类型为JSON(Hibernate会根据方言映射到PostgreSQL的JSONB) @Override public int getSqlType() { return SqlTypes.JSON; } }
旧版Hibernate(无getSqlType方法):
在实体的字段上直接指定列定义:
import jakarta.persistence.Column; import jakarta.persistence.Convert; import jakarta.persistence.Entity; import jakarta.persistence.Id; @Entity public class YourEntity { @Id private Long id; @Column(name = "jsonb_column", columnDefinition = "jsonb") @Convert(converter = JsonbToStringConverter.class) private String jsonbContent; // getter和setter省略 }
2. 确认方言配置(可选但推荐)
你用的PostgreSQL95Dialect已经支持JSONB,但如果你的Hibernate版本比较新,建议升级到PostgreSQL10Dialect或更高版本,对JSONB的处理会更稳定,避免一些兼容性问题。
为什么会出现这个错误?
当属性转换器没有明确指定SQL类型时,Hibernate会把目标类型默认识别为Object,对应的内部类型码就是1936628443。PostgreSQL驱动接收到这个类型码后,无法匹配到它支持的任何SQL类型(比如JSONB对应的类型码是Types.JSON或PostgreSQL自定义的类型码),所以就抛出了这个未知类型的异常。
内容的提问来源于stack exchange,提问作者Patryk Imosa
相关产品推荐
相关产品推荐

