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

Spring Boot JPA连接Oracle时出现Numeric Overflow异常求助

解决Spring Data JPA + Oracle无法获取SequenceInformation的Numeric Overflow异常

这个错误的核心原因是:Hibernate在尝试读取Oracle数据库中的序列元数据时,某些序列的MAXVALUE/MINVALUE超出了Java Long类型的取值范围,导致调用getLong()方法时触发数值溢出异常。

Oracle数据库中很多系统序列(比如SYS用户下的序列)的MAXVALUE设置为9999999999999999999999999999,这个值远大于Java Long的最大值9223372036854775807,而你使用的Hibernate 5.4.24.Final版本在提取序列信息时,会用getLong()来读取这些数值,直接触发溢出。

结合你的代码场景(手动设置实体ID,未使用序列生成主键),可以用以下几种方案解决:

方案1:禁用Hibernate的自动Schema更新(最简单)

你已经手动创建了数据库表,不需要Hibernate自动执行update操作。修改配置文件中的ddl-auto为none,这样Hibernate就不会去扫描数据库中的序列信息了:

spring.jpa.hibernate.ddl-auto=none

方案2:升级Hibernate版本到修复后的版本

Hibernate在5.4.25.Final及以上版本中修复了这个问题,改用BigDecimal来读取序列的MIN/MAX值,避免数值溢出。如果是Spring Boot项目,升级到2.4.0及以上版本即可(Spring Boot 2.4.0对应Hibernate 5.4.25.Final)。

方案3:自定义Oracle方言,替换序列信息提取器

如果无法升级Hibernate,可以自定义Oracle12cDialect,重写序列信息提取逻辑,用BigDecimal代替Long读取序列数值:

  1. 创建自定义方言类:
import org.hibernate.dialect.Oracle12cDialect;
import org.hibernate.tool.schema.extract.internal.SequenceInformationExtractorLegacyImpl;
import org.hibernate.tool.schema.extract.spi.SequenceInformationExtractor;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.math.BigDecimal;

public class CustomOracle12cDialect extends Oracle12cDialect {
    @Override
    public SequenceInformationExtractor getSequenceInformationExtractor() {
        return new SequenceInformationExtractorLegacyImpl() {
            @Override
            protected Long resultSetMinValue(ResultSet resultSet) throws SQLException {
                BigDecimal value = resultSet.getBigDecimal("MIN_VALUE");
                return value != null ? value.longValue() : null;
            }

            @Override
            protected Long resultSetMaxValue(ResultSet resultSet) throws SQLException {
                BigDecimal value = resultSet.getBigDecimal("MAX_VALUE");
                return value != null ? value.longValue() : null;
            }
        };
    }
}
  1. 修改配置文件中的方言为自定义类:
spring.jpa.properties.hibernate.dialect=com.yourpackage.CustomOracle12cDialect

方案4:指定Hibernate只扫描当前用户的Schema

如果必须保留ddl-auto=update,可以配置Hibernate只扫描你当前使用的apps Schema,避免扫描系统Schema中的问题序列:

spring.jpa.properties.hibernate.default_schema=apps

测试下来,方案1应该最适合你的场景,因为你已经手动创建了表,禁用自动Schema更新既解决问题又减少不必要的数据库操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:52:47