PostgreSQL设置TEXT类型仍报varchar(255)长度超限Spring Data JPA问题
解决方案
问题根因说明
- 你当前数据库表的
description字段实际为varchar(100000)类型,修改实体类注解后没有同步更新表结构,因此长度超出限制时依然会报错。 - 使用
@Lob注解时,PostgreSQL默认将Lob映射为OID类型的外置大对象,字段中存储的是大对象的ID而非文本内容,Session关闭后无法读取对应流数据,因此序列化时会抛出流访问异常。 - 仅设置
@Column(columnDefinition="TEXT")未指定类型映射时,部分Hibernate版本会优先使用默认字符串映射规则,依然会按照varchar类型处理。
正确配置步骤
1. 实体类注解配置
Hibernate 5.x版本:
import org.hibernate.annotations.Type; import javax.persistence.Column; // 省略类其他代码 @Type(type = "org.hibernate.type.TextType") @Column(columnDefinition = "TEXT") private String description;
Hibernate 6.x版本:
import org.hibernate.annotations.JdbcTypeCode; import org.hibernate.type.SqlTypes; import jakarta.persistence.Column; // 省略类其他代码 @JdbcTypeCode(SqlTypes.LONGVARCHAR) @Column(columnDefinition = "TEXT") private String description;
2. 同步更新数据库表结构
执行以下SQL手动修改字段类型(生产环境建议提前备份数据):
ALTER TABLE public.detail ALTER COLUMN description TYPE TEXT USING description::TEXT;
如果是开发环境,也可以开启spring.jpa.hibernate.ddl-auto=update,重启项目后会自动更新字段类型。
配置验证
配置完成后重新写入大文本数据即可正常存取,TEXT类型在PostgreSQL中支持最大1GB的文本存储,完全满足常规大文本需求,且为行内存储,序列化时不会出现流访问异常。
内容的提问来源于stack exchange,提问作者Unknown Guy
相关产品推荐
相关产品推荐

