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 列,而不是其他类型的表达式。
备注:内容仅供参考。
