Spring Boot存储嵌套JSON到PostgreSQL出现数组越界异常如何解决
解决方案
错误根源
你遇到的java.lang.ArrayIndexOutOfBoundsException是Hibernate 5.4.x版本的已知缺陷,当你使用@Embeddable注解映射多层嵌套的集合/数组类型JSON字段时,Hibernate内置的复合类型深拷贝逻辑无法正确识别嵌套结构的长度,最终触发数组越界。
修复方式
方案1:直接映射为PostgreSQL JSONB类型(最推荐)
PostgreSQL原生支持JSONB格式存储,无需拆分嵌套结构映射为多个实体类,操作成本最低:
- 实体类对应字段添加JSON类型映射注解,Spring Boot 2.7+版本可以直接使用
@JdbcTypeCode注解:
@Entity @Table(name = "tender_file") public class TenderFileEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; // 直接映射整段JSON结构,字段类型可以是你自定义的DTO类,也可以用JsonNode、String @Column(columnDefinition = "jsonb") @JdbcTypeCode(SqlTypes.JSON) private List<TenderRootDTO> content; // 省略getter、setter }
- 按JSON结构定义对应的DTO类即可,不需要加任何Hibernate注解:
// 根节点DTO public class TenderRootDTO { private BasicInfo basicInfo; private String multiCurrencyForBoq; private String boqinfo; private CoverInfo coverinfo; // 省略getter、setter } public class CoverInfo { private List<Cover> cover; // 省略getter、setter } // 其余BasicInfo、Cover类按JSON字段正常定义即可
方案2:升级Hibernate版本
该缺陷在Hibernate 5.6.0及以上版本已经完成修复,你可以直接升级Hibernate核心依赖,或者升级Spring Boot版本到2.6.x及以上,关联依赖会自动升级到修复后的版本。
方案3:自定义类型处理器
如果必须保留当前Hibernate版本和原有实体映射结构,你可以自定义Hibernate复合类型处理器,自行实现嵌套数组的深拷贝逻辑,替换默认的ComponentType处理规则即可。
内容的提问来源于stack exchange,提问作者Akoram
相关产品推荐
相关产品推荐

