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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 06:06:02