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

升级至Spring 3.1.0 & Java 17后出现数值溢出错误,求解决方案

解决Spring 3.1.0 + Java 17升级后的Oracle数值溢出问题

问题根源

从错误栈可以明确:代码尝试用getInt()读取Oracle数据库中超出Java int范围(-2147483648 ~ 2147483647)的数值,导致溢出。升级到Spring 3.1.0和Java 17后,Hibernate/JDBC的类型映射逻辑更严格,或是数据库中部分字段的实际存储值超出了实体类定义的Integer类型上限。

可行解决方案

  • 修正实体类与数据库字段的类型匹配
    检查实体类中对应字段的类型:如果数据库字段是NUMBER(10,0)及以上精度的类型,存储值大概率会超出Java int范围,直接把实体类字段类型从Integer改为Long即可。
    示例代码:

    // 原代码
    private Integer orderId;
    // 修改后
    private Long orderId;
    

    同时要确认数据库字段的存储范围,确保Long(最大9223372036854775807)能覆盖所有现有数据。

  • 调整Hibernate类型映射(临时方案)
    如果暂时无法修改实体类类型,可通过注解强制Hibernate用更大的类型读取数据,但这种方式存在数据截断风险,仅作临时过渡使用:

    @Column(columnDefinition = "NUMBER(10,0)")
    @Type(type = "long")
    private Integer orderId;
    
  • 升级Oracle JDBC驱动
    旧版Oracle JDBC驱动在Java 17环境下可能存在数值类型处理的兼容性问题,替换为兼容Java 11+的ojdbc11最新版本:

    <!-- Maven依赖示例 -->
    <dependency>
        <groupId>com.oracle.database.jdbc</groupId>
        <artifactId>ojdbc11</artifactId>
        <version>23.3.0.23.09</version>
    </dependency>
    
  • 检查自定义SQL的数值转换
    排查业务中的自定义SQL,确认是否存在CAST(large_column AS INT)这类强制转换为int的逻辑,这类操作会在数据库端截断数值,导致读取时溢出,需修改为CAST(large_column AS NUMBER)或直接使用原字段。

验证步骤

  1. 执行SELECT MAX(column_name), MIN(column_name) FROM your_table,确认所有数据都在修改后类型的范围内;
  2. 重启服务后执行触发错误的业务操作,确认溢出问题消失。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 12:12:36