升级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
相关产品推荐
相关产品推荐

