最近项目中使用到了oracle数据库,之前用的都是mysql,在更换数据库之后项目启动报一直报错,百度了很多都说是数据类型不匹配  版本不匹配  但是检查之后仍然报错。

报错信息如下:

2023-01-17 11:09:34 462-->[RMI TCP Connection(3)-127.0.0.1]--[ERROR]--[JdbcEnvironmentImpl]--Could not fetch the SequenceInformation from the database

java.sql.SQLException: 数字溢出

at oracle.jdbc.driver.NumberCommonAccessor.throwOverflow(NumberCommonAccessor.java:4381) ~[ojdbc6-11.2.0.4.jar:11.2.0.4.0]

at oracle.jdbc.driver.NumberCommonAccessor.getLong(NumberCommonAccessor.java:711) ~[ojdbc6-11.2.0.4.jar:11.2.0.4.0]

at oracle.jdbc.driver.OracleResultSetImpl.getLong(OracleResultSetImpl.java:985) ~[ojdbc6-11.2.0.4.jar:11.2.0.4.0]

at oracle.jdbc.driver.OracleResultSet.getLong(OracleResultSet.java:444) ~[ojdbc6-11.2.0.4.jar:11.2.0.4.0]

at org.hibernate.tool.schema.extract.internal.SequenceInformationExtractorLegacyImpl.resultSetMinValue(SequenceInformationExtractorLegacyImpl.java:134) ~[hibernate-core-5.4.23.Final.jar:5.4.23.Final]

at org.hibernate.tool.schema.extract.internal.SequenceInformationExtractorLegacyImpl.extractMetadata(SequenceInformationExtractorLegacyImpl.java:60) ~[hibernate-core-5.4.23.Final.jar:5.4.23.Final]

at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentImpl.sequenceInformationList(JdbcEnvironmentImpl.java:403) ~[hibernate-core-5.4.23.Final.jar:5.4.23.Final]

at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentImpl.(JdbcEnvironmentImpl.java:268) ~[hibernate-core-5.4.23.Final.jar:5.4.23.Final]

at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:114) ~[hibernate-core-5.4.23.Final.jar:5.4.23.Final]

at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:35) ~[hibernate-core-5.4.23.Final.jar:5.4.23.Final]

at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.initiateService(StandardServiceRegistryImpl.java:101) ~[hibernate-core-5.4.23.Final.jar:5.4.23.Final]

at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:263) ~[hibernate-core-5.4.23.Final.jar:5.4.23.Final]

at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:237) ~[hibernate-core-5.4.23.Final.jar:5.4.23.Final]

at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:214) ~[hibernate-core-5.4.23.Final.jar:5.4.23.Final]

at org.hibernate.id.factory.internal.DefaultIdentifierGeneratorFactory.injectServices(DefaultIdentifierGeneratorFactory.java:152) ~[hibernate-core-5.4.23.Final.jar:5.4.23.Final]

at org.hibernate.service.internal.AbstractServiceRegistryImpl.injectDependencies(AbstractServiceRegistryImpl.java:286) ~[hibernate-core-5.4.23.Final.jar:5.4.23.Final]

at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:243) ~[hibernate-core-5.4.23.Final.jar:5.4.23.Final]

at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:214) ~[hibernate-core-5.4.23.Final.jar:5.4.23.Final]

at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.(InFlightMetadataCollectorImpl.java:176) ~[hibernate-core-5.4.23.Final.jar:5.4.23.Final]

at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:118) ~[hibernate-core-5.4.23.Final.jar:5.4.23.Final]

at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:1224) ~[hibernate-core-5.4.23.Final.jar:5.4.23.Final]

at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1255) ~[hibernate-core-5.4.23.Final.jar:5.4.23.Final]

at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:60) ~[spring-orm-4.3.25.RELEASE.jar:4.3.25.RELEASE]

at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:360) ~[spring-orm-4.3.25.RELEASE.jar:4.3.25.RELEASE]

at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:384) ~[spring-orm-4.3.25.RELEASE.jar:4.3.25.RELEASE]

at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:371) ~[spring-orm-4.3.25.RELEASE.jar:4.3.25.RELEASE]

at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:336) ~[spring-orm-4.3.25.RELEASE.jar:4.3.25.RELEASE]

at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1692) ~[spring-beans-4.3.18.RELEASE.jar:4.3.18.RELEASE]

at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1630) ~[spring-beans-4.3.18.RELEASE.jar:4.3.18.RELEASE]

at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:555) ~[spring-beans-4.3.18.RELEASE.jar:4.3.18.RELEASE]

at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483) ~[spring-beans-4.3.18.RELEASE.jar:4.3.18.RELEASE]

at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:312) ~[spring-beans-4.3.18.RELEASE.jar:4.3.18.RELEASE]

at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) ~[spring-beans-4.3.18.RELEASE.jar:4.3.18.RELEASE]

at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:308) ~[spring-beans-4.3.18.RELEASE.jar:4.3.18.RELEASE]

at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) ~[spring-beans-4.3.18.RELEASE.jar:4.3.18.RELEASE]

at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1080) ~[spring-context-4.3.18.RELEASE.jar:4.3.18.RELEASE]

at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:857) ~[spring-context-4.3.18.RELEASE.jar:4.3.18.RELEASE]

at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:543) ~[spring-context-4.3.18.RELEASE.jar:4.3.18.RELEASE]

at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:123) ~[spring-boot-1.5.22.RELEASE.jar:1.5.22.RELEASE]

at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:666) ~[spring-boot-1.5.22.RELEASE.jar:1.5.22.RELEASE]

at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:353) ~[spring-boot-1.5.22.RELEASE.jar:1.5.22.RELEASE]

at org.springframework.boot.SpringApplication.run(SpringApplication.java:300) ~[spring-boot-1.5.22.RELEASE.jar:1.5.22.RELEASE]

at org.springframework.boot.web.support.SpringBootServletInitializer.run(SpringBootServletInitializer.java:151) ~[spring-boot-1.5.22.RELEASE.jar:1.5.22.RELEASE]

at org.springframework.boot.web.support.SpringBootServletInitializer.createRootApplicationContext(SpringBootServletInitializer.java:131) ~[spring-boot-1.5.22.RELEASE.jar:1.5.22.RELEASE]

at org.springframework.boot.web.support.SpringBootServletInitializer.onStartup(SpringBootServletInitializer.java:91) ~[spring-boot-1.5.22.RELEASE.jar:1.5.22.RELEASE]

at org.springframework.web.SpringServletContainerInitializer.onStartup(SpringServletContainerInitializer.java:169) ~[spring-web-4.3.18.RELEASE.jar:4.3.18.RELEASE]

at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5144) ~[catalina.jar:8.5.57]

at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) ~[catalina.jar:8.5.57]

at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:743) ~[catalina.jar:8.5.57]

at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:719) ~[catalina.jar:8.5.57]

at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:705) ~[catalina.jar:8.5.57]

at org.apache.catalina.startup.HostConfig.manageApp(HostConfig.java:1719) ~[catalina.jar:8.5.57]

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_92]

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_92]

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_92]

at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_92]

at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:286) ~[tomcat-coyote.jar:8.5.57]

at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819) ~[?:1.8.0_92]

at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801) ~[?:1.8.0_92]

at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:479) ~[catalina.jar:8.5.57]

at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:428) ~[catalina.jar:8.5.57]

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_92]

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_92]

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_92]

at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_92]

at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:286) ~[tomcat-coyote.jar:8.5.57]

at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819) ~[?:1.8.0_92]

at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801) ~[?:1.8.0_92]

at com.sun.jmx.remote.security.MBeanServerAccessController.invoke(MBeanServerAccessController.java:468) ~[?:1.8.0_92]

at javax.management.remote.rmi.RMIConnectionImpl.doOperation(RMIConnectionImpl.java:1468) ~[?:1.8.0_92]

at javax.management.remote.rmi.RMIConnectionImpl.access$300(RMIConnectionImpl.java:76) ~[?:1.8.0_92]

at javax.management.remote.rmi.RMIConnectionImpl$PrivilegedOperation.run(RMIConnectionImpl.java:1309) ~[?:1.8.0_92]

at java.security.AccessController.doPrivileged(Native Method) ~[?:1.8.0_92]

at javax.management.remote.rmi.RMIConnectionImpl.doPrivilegedOperation(RMIConnectionImpl.java:1408) ~[?:1.8.0_92]

at javax.management.remote.rmi.RMIConnectionImpl.invoke(RMIConnectionImpl.java:829) ~[?:1.8.0_92]

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_92]

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_92]

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_92]

at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_92]

at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:324) ~[?:1.8.0_92]

at sun.rmi.transport.Transport$1.run(Transport.java:200) ~[?:1.8.0_92]

at sun.rmi.transport.Transport$1.run(Transport.java:197) ~[?:1.8.0_92]

at java.security.AccessController.doPrivileged(Native Method) ~[?:1.8.0_92]

at sun.rmi.transport.Transport.serviceCall(Transport.java:196) ~[?:1.8.0_92]

at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:568) ~[?:1.8.0_92]

at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:826) ~[?:1.8.0_92]

at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:683) ~[?:1.8.0_92]

at java.security.AccessController.doPrivileged(Native Method) ~[?:1.8.0_92]

at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:682) ~[?:1.8.0_92]

at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) ~[?:1.8.0_92]

at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) ~[?:1.8.0_92]

at java.lang.Thread.run(Thread.java:745) ~[?:1.8.0_92]

经过一系列操作发现是Dialect(方言)的问题,在springboot项目中配置方言

#配置方言 根据版本改变 Oracle10gDialect 是11版本的方言

spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.Oracle10gDialect

现在Dialect是Oracle10g Dialect,而Oracle10gDialect继承自Oracle9iDialect,Oracle9iDialect又继承自Oracle8iDialect,我们要找的getQuerySequencesString()实际返回的值为“select * from all_sequences”,这样分析出来这段代码的作用是获取数据库中所有的sequence的属性,会报错是因为数据库中存在某一个或者多个的sequence的最大或最小值超过了java中Long类型的范围,导致转换报错。

解决办法:

1.新建一个自定义CustomSequenceInformationExtractor类

package com.newcapec.sd.ecard.webservice.utils;

import java.sql.ResultSet;

import java.sql.SQLException;

import org.hibernate.tool.schema.extract.internal.SequenceInformationExtractorOracleDatabaseImpl;

public class CustomSequenceInformationExtractor extends SequenceInformationExtractorOracleDatabaseImpl {

/**

* Singleton access

*/

public static final CustomSequenceInformationExtractor INSTANCE = new CustomSequenceInformationExtractor();

@Override

protected Long resultSetMinValue(ResultSet resultSet) throws SQLException {

return resultSet.getBigDecimal("min_value").longValue();

}

}

2.新建一个自定义Dialect类CustomOracleDialect

package com.example.batchprocessing.hibernate;

import org.hibernate.dialect.Oracle12cDialect;

import org.hibernate.tool.schema.extract.spi.SequenceInformationExtractor;

public class CustomOracleDialect extends Oracle12cDialect {

@Override

public SequenceInformationExtractor getSequenceInformationExtractor() {

return CustomSequenceInformationExtractor.INSTANCE;

}

@Override

public String getQuerySequencesString() {

return "select * from user_sequences";

}

}

3,在application.properties文件中指定Dialect类

spring.jpa.properties.hibernate.dialect=com.newcapec.sd.ecard.webservice.utils.CustomOracleDialect

该种解决方案的原理是在去获取数据库sequnce的最小值时,使用resultSet.getBigDecimal("min_value").longValue()的方式去获取,这样就可以避免出现数值超出Long范围导致报错的问题。

参考文章:

java - Hibernate could not fetch the SequenceInformation from the database - Stack Overflow

SpringBoot项目中使用Spring-data-jpa启动时报错Could not fetch the SequenceInformation from the database_贝壳小田田的博客-CSDN博客_could not fetch the sequenceinformation from the d

精彩文章

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。