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

Spring Boot+Hibernate 6向PostgreSQL存储byte[]报错求解决方案

解决Hibernate 6 + PostgreSQL byte[] 存储类型不匹配问题

针对你遇到的column "data" is of type bytea but expression is of type bigint错误,核心原因是Hibernate 6对LOB类型的映射逻辑和Hibernate 5不同,旧的@Type注解已被废弃,以下是几种可行的解决思路:

方案1:移除@Lob注解

Hibernate 6中,byte[]类型默认会直接映射到PostgreSQL的bytea列,无需额外的@Lob注解。添加@Lob反而会让Hibernate将其识别为大对象(对应PostgreSQL的oid类型),导致类型不匹配。

修改实体类的data字段:

@Column(name = "data")
private byte[] data;

方案2:保留@Lob并指定列类型

如果业务上需要保留@Lob注解,可通过@Column的columnDefinition强制指定列类型为bytea:

@Lob
@Column(name = "data", columnDefinition = "bytea")
private byte[] data;

方案3:使用Hibernate 6专属类型注解

Hibernate 6引入了新的类型注解体系,可直接指定对应JDBC类型:

方式3.1:使用@JdbcTypeCode

import jakarta.persistence.Column;
import org.hibernate.annotations.JdbcTypeCode;
import org.hibernate.type.SqlTypes;

// ...

@Column(name = "data")
@JdbcTypeCode(SqlTypes.VARBINARY)
private byte[] data;

方式3.2:使用PostgreSQL专属JDBC类型

直接指定PostgreSQL的bytea类型处理器:

import jakarta.persistence.Column;
import org.hibernate.annotations.JdbcType;
import org.hibernate.type.descriptor.jdbc.PostgreSqlByteaJdbcType;

// ...

@Column(name = "data")
@JdbcType(PostgreSqlByteaJdbcType.class)
private byte[] data;

原因说明

Hibernate 6重构了类型映射系统,废弃了Hibernate 5中的org.hibernate.type.ImageType、org.hibernate.type.BinaryType等类型。当你给byte[]添加@Lob时,Hibernate会默认将其映射为PostgreSQL的BLOB类型(对应数据库的oid字段),而你的数据库列是bytea,因此出现类型不匹配的错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 11:12:49