Spring Boot JPA连接Oracle时出现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读取序列数值:
- 创建自定义方言类:
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; } }; } }
- 修改配置文件中的方言为自定义类:
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

