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

升级Java、Spring及依赖后,@Lob注解实体报Data truncation错误求解决方案

问题解决方法

问题原因

Spring/JPA(Hibernate)版本升级后,@Lob注解的默认数据库字段映射类型发生了变化——旧版本可能默认映射为TEXT或LONGTEXT,新版本默认映射成了TINYTEXT(仅支持最多255字符)。而你的表中已有行的params字段内容长度超过了TINYTEXT的上限,导致执行ALTER TABLE修改字段类型时触发数据截断报错。

具体解决方案

1. 显式指定字段映射类型(推荐长期方案)

在实体类的@Lob字段上添加@Column注解,强制指定数据库字段类型为TEXT或LONGTEXT,覆盖Hibernate的默认映射规则:

@Getter
@Setter
@Entity
public class ActivityLog extends AdditionalAbstractAuditable<Long> {

    private String eventName;

    @Lob
    @Column(columnDefinition = "TEXT") // 或用"LONGTEXT"适配更长内容
    private String params;

    @Embedded
    private ActivityParamsId activityParamsId;
}
  • TEXT支持最多65535字符,足以覆盖大部分场景;如果你的内容超过这个长度,改用LONGTEXT(支持最多4GB数据)。
  • 所有带@Lob注解的实体字段都需要做此调整,避免其他表出现同类错误。

2. 手动调整数据库字段类型(应急快速方案)

先备份目标表的数据,然后手动执行SQL修改字段类型,再启动应用:

-- MySQL 示例,其他数据库对应调整类型(如PostgreSQL用TEXT,Oracle用CLOB)
ALTER TABLE activity_log MODIFY COLUMN params TEXT;

修改完成后,可根据需求调整Hibernate的DDL自动执行策略(比如保持spring.jpa.hibernate.ddl-auto=update)。

3. 临时禁用Hibernate自动DDL(仅临时应急)

如果暂时不想修改实体类或数据库,可先将application.properties(或application.yml)中的DDL策略改为none,阻止Hibernate自动执行表结构修改:

spring.jpa.hibernate.ddl-auto=none

但这只是临时方案,后续仍需通过前两种方法彻底解决字段类型不匹配的问题,避免版本迭代时再次出现冲突。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 09:50:55