PAYATHON 2026

Hibernate 映射 pgvector 时如何修复反序列化错误?

数据阿明

结论

先将实体中的 embedding 类型从 double[] 改为 float[],并确认项目已引入与 Hibernate ORM 版本一致的 hibernate-vector 依赖。Hibernate ORM 6.4 的 pgvector 映射将 SqlTypes.VECTOR 对应到 float[]。VECTOR_FLOAT64 用于 Oracle 23ai 的双精度向量类型,不能替代 PostgreSQL 的 pgvector 映射。Hibernate ORM 6.4 向量映射文档,SqlTypes Javadoc

推荐映射

将字段改为:

@JdbcTypeCode(SqlTypes.VECTOR)
@Column(columnDefinition = "vector(1024)")
@Array(length = 1024)
private float[] embedding;

@Array(length = 1024) 声明向量长度,数据库列仍为 vector(1024)。这里的 @Array 是 Hibernate 注解,不会将列映射为普通 PostgreSQL 数组。

检查 Hibernate 向量模块

Hibernate 的向量支持由独立的 hibernate-vector 模块提供。将它加入项目,并保持版本与 hibernate-core 一致。例如,使用 Maven 时:

<dependency>
    <groupId>org.hibernate.orm</groupId>
    <artifactId>hibernate-vector</artifactId>
    <version>${hibernate.version}</version>
</dependency>

该模块通过 Java ServiceLoader 注册向量类型。如果改为 float[] 后仍出现同样的错误,请检查运行时依赖是否包含该模块,以及当前 Hibernate 版本是否支持此映射。官方指南从 Hibernate ORM 6.4 起介绍了 hibernate-vector 和 SqlTypes.VECTOR 的用法。

为什么会出现这个错误

错误头 5B2D302E 对应向量文本的开头 [-0.。这表明 Hibernate 读取到的是向量文本,却将其交给了 Java 对象反序列化路径;这段内容不是有效的 Java 序列化流。实体使用了 double[],而 Hibernate 的 pgvector VECTOR 映射预期使用 float[]。因此,先修正字段类型,并确认向量 JDBC 类型已正确注册。

如果改为 float[] 并确认模块依赖后问题仍然存在,仅凭这段异常无法确定其他原因。接下来应核对 Hibernate 和 PostgreSQL JDBC 驱动的版本、实际运行时依赖,以及应用启动时 Hibernate 为 embedding 选用的 JDBC 类型。也可以查看生成的 SQL 和列元数据,确认查询取回的是 vector 列,而不是其他类型的表达式。

备注:内容仅供参考。