"java.sql.SQLSyntaxErrorException: ORA-00942: table or view does not exist" 在两个 SQLSessionFactory bean 之一上使用 @Primary 时
"java.sql.SQLSyntaxErrorException: ORA-00942: table or view does not exist" when using @Primary on one of the two SQLSessionFactory bean
我有两个数据源,它们都可以单独正常工作。但是,当我在两个 SqlSessionFactory 之一上使用 @Primary
时,另一个开始抛出下面提到的异常:
Exception in thread "main"
org.springframework.beans.factory.BeanCreationException: Error
creating bean with name 'pServiceImpl': Invocation of
init method failed; nested exception is
org.springframework.jdbc.BadSqlGrammarException: Error querying
database. Cause: java.sql.SQLSyntaxErrorException: ORA-00942: table
or view does not exist
The error may exist in com/abc/def/mapper/pMapper.java (best guess)
The error may involve defaultParameterMap
The error occurred while setting parameters
SQL: select C.CONTACT_ID, C.REF_ID, S.P_ID, S.COURIER_P_NUM, S.SENDER_ADDR_ID, S.CREATION_TS,
CA.CONTACT_ADDR_ID from P_EVENT_TRACKING SE, P S,
CONTACT_ADDR CA, CONTACT C where SE.EVENT_CD = 'PICKUP' and
SE.P_ID = s.p_id and S.SENDER_ADDR_ID =
CA.CONTACT_ADDR_ID and CA.CONTACT_ID = c.contact_id and C.GROUP_CD =
'OT' and SE.EVENT_OCCURRED_IND = 'N' and S.CREATION_TS >= (select
CURRENT_TIMESTAMP - interval '30' day from dual)and
S.SCHEDULE_PICKUP_IND = 'Y'
Cause: java.sql.SQLSyntaxErrorException: ORA-00942: table or view does not exist
; bad SQL grammar []; nested exception is
java.sql.SQLSyntaxErrorException: ORA-00942: table or view does not
exist
at
org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization(InitDestroyAnnotationBeanPostProcessor.java:137)
at
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization(AbstractAutowireCapableBeanFactory.java:409)
at
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1620)
at
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:555)
at
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)
at
org.springframework.beans.factory.support.AbstractBeanFactory.getObject(AbstractBeanFactory.java:306)
at
org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
at
org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
at
org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
at
org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:761)
at
org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:867)
at
org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:543)
at
org.springframework.context.annotation.AnnotationConfigApplicationContext.(AnnotationConfigApplicationContext.java:84)
at
com.abc.def.app.starter.Pickup.main(Pickup.java:11)
Caused by: org.springframework.jdbc.BadSqlGrammarException:
Error querying database. Cause: java.sql.SQLSyntaxErrorException: ORA-00942: table or view does not exist
The error may exist in com/abc/def/mapper/PMapper.java (best guess)
The error may involve defaultParameterMap
The error occurred while setting parameters
SQL: select C.CONTACT_ID, C.REF_ID, S.P_ID, S.COURIER_P_NUM, S.SENDER_ADDR_ID, S.CREATION_TS,
CA.CONTACT_ADDR_ID from P_EVENT_TRACKING SE, P S,
CONTACT_ADDR CA, CONTACT C where SE.EVENT_CD = 'PICKUP' and
SE.P_ID = s.p_id and S.SENDER_ADDR_ID =
CA.CONTACT_ADDR_ID and CA.CONTACT_ID = c.contact_id and C.GROUP_CD =
'OT' and SE.EVENT_OCCURRED_IND = 'N' and S.CREATION_TS >= (select
CURRENT_TIMESTAMP - interval '30' day from dual)and
S.SCHEDULE_PICKUP_IND = 'Y'
Cause: java.sql.SQLSyntaxErrorException: ORA-00942: table or view does not exist
; bad SQL grammar []; nested exception is
java.sql.SQLSyntaxErrorException: ORA-00942: table or view does not
exist
at
org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:231)
at
org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:73)
at
org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:73)
at
org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:446)
at com.sun.proxy.$Proxy26.selectList(Unknown Source) at
org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:230)
at
org.apache.ibatis.binding.MapperMethod.executeForMany(MapperMethod.java:137)
at
org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:75)
at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:59)
at com.sun.proxy.$Proxy32.findPByOutlet(Unknown Source) at
com.abc.def.dao.PDAOImpl.getPByOutlet(PDAOImpl.java:23)
at
com.abc.def.service.PickupServiceImpl.startExecution(PickupServiceImpl.java:62)
at
com.abc.def.service.PickupServiceImpl.execute(PickupServiceImpl.java:46)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at
sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at
sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at
java.lang.reflect.Method.invoke(Unknown Source) at
org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleElement.invoke(InitDestroyAnnotationBeanPostProcessor.java:366)
at
org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleMetadata.invokeInitMethods(InitDestroyAnnotationBeanPostProcessor.java:311)
at
org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization(InitDestroyAnnotationBeanPostProcessor.java:134)
... 13 more
如果更改 @Primary
注释的位置可以解决此问题,则意味着在您的 spring 配置中,您正在使用 SqlSessionFactory
到 SqlSessionTemplate
类型的自动装配由 PDAOImpl
使用或按 PDAOImpl
.
中 SqlSessionTemplate
的类型自动装配
确保您明确指定了正确的依赖关系。
您收到此错误是因为 PDAOImpl
使用不正确的 SqlSessionFactory
调用了没有 table.
的数据库
它像这样对我有用。删除了映射器的自动注册(即 @Mapper
)并在 SQLSessionTemplate
中手动注册了映射器,如下所示:
@Bean
public TestMapper testMapper() throws Exception {
SqlSessionTemplate sessionTemplate = new SqlSessionTemplate(sqlSessionFactory());
sessionTemplate.getConfiguration().addMapper(TestMapper.class); // new code
return sessionTemplate.getMapper(TestMapper.class);
}
我有两个数据源,它们都可以单独正常工作。但是,当我在两个 SqlSessionFactory 之一上使用 @Primary
时,另一个开始抛出下面提到的异常:
Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'pServiceImpl': Invocation of init method failed; nested exception is org.springframework.jdbc.BadSqlGrammarException: Error querying database. Cause: java.sql.SQLSyntaxErrorException: ORA-00942: table or view does not exist
The error may exist in com/abc/def/mapper/pMapper.java (best guess)
The error may involve defaultParameterMap
The error occurred while setting parameters
SQL: select C.CONTACT_ID, C.REF_ID, S.P_ID, S.COURIER_P_NUM, S.SENDER_ADDR_ID, S.CREATION_TS, CA.CONTACT_ADDR_ID from P_EVENT_TRACKING SE, P S, CONTACT_ADDR CA, CONTACT C where SE.EVENT_CD = 'PICKUP' and SE.P_ID = s.p_id and S.SENDER_ADDR_ID = CA.CONTACT_ADDR_ID and CA.CONTACT_ID = c.contact_id and C.GROUP_CD = 'OT' and SE.EVENT_OCCURRED_IND = 'N' and S.CREATION_TS >= (select CURRENT_TIMESTAMP - interval '30' day from dual)and S.SCHEDULE_PICKUP_IND = 'Y'
Cause: java.sql.SQLSyntaxErrorException: ORA-00942: table or view does not exist
; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: ORA-00942: table or view does not exist
at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization(InitDestroyAnnotationBeanPostProcessor.java:137) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization(AbstractAutowireCapableBeanFactory.java:409) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1620) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:555) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483) at org.springframework.beans.factory.support.AbstractBeanFactory.getObject(AbstractBeanFactory.java:306) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:761) at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:867) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:543) at org.springframework.context.annotation.AnnotationConfigApplicationContext.(AnnotationConfigApplicationContext.java:84) at com.abc.def.app.starter.Pickup.main(Pickup.java:11) Caused by: org.springframework.jdbc.BadSqlGrammarException:
Error querying database. Cause: java.sql.SQLSyntaxErrorException: ORA-00942: table or view does not exist
The error may exist in com/abc/def/mapper/PMapper.java (best guess)
The error may involve defaultParameterMap
The error occurred while setting parameters
SQL: select C.CONTACT_ID, C.REF_ID, S.P_ID, S.COURIER_P_NUM, S.SENDER_ADDR_ID, S.CREATION_TS, CA.CONTACT_ADDR_ID from P_EVENT_TRACKING SE, P S, CONTACT_ADDR CA, CONTACT C where SE.EVENT_CD = 'PICKUP' and SE.P_ID = s.p_id and S.SENDER_ADDR_ID = CA.CONTACT_ADDR_ID and CA.CONTACT_ID = c.contact_id and C.GROUP_CD = 'OT' and SE.EVENT_OCCURRED_IND = 'N' and S.CREATION_TS >= (select CURRENT_TIMESTAMP - interval '30' day from dual)and S.SCHEDULE_PICKUP_IND = 'Y'
Cause: java.sql.SQLSyntaxErrorException: ORA-00942: table or view does not exist
; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: ORA-00942: table or view does not exist
at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:231) at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:73) at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:73) at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:446) at com.sun.proxy.$Proxy26.selectList(Unknown Source) at org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:230) at org.apache.ibatis.binding.MapperMethod.executeForMany(MapperMethod.java:137) at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:75) at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:59) at com.sun.proxy.$Proxy32.findPByOutlet(Unknown Source) at com.abc.def.dao.PDAOImpl.getPByOutlet(PDAOImpl.java:23) at com.abc.def.service.PickupServiceImpl.startExecution(PickupServiceImpl.java:62) at com.abc.def.service.PickupServiceImpl.execute(PickupServiceImpl.java:46) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleElement.invoke(InitDestroyAnnotationBeanPostProcessor.java:366) at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleMetadata.invokeInitMethods(InitDestroyAnnotationBeanPostProcessor.java:311) at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization(InitDestroyAnnotationBeanPostProcessor.java:134) ... 13 more
如果更改 @Primary
注释的位置可以解决此问题,则意味着在您的 spring 配置中,您正在使用 SqlSessionFactory
到 SqlSessionTemplate
类型的自动装配由 PDAOImpl
使用或按 PDAOImpl
.
SqlSessionTemplate
的类型自动装配
确保您明确指定了正确的依赖关系。
您收到此错误是因为 PDAOImpl
使用不正确的 SqlSessionFactory
调用了没有 table.
它像这样对我有用。删除了映射器的自动注册(即 @Mapper
)并在 SQLSessionTemplate
中手动注册了映射器,如下所示:
@Bean
public TestMapper testMapper() throws Exception {
SqlSessionTemplate sessionTemplate = new SqlSessionTemplate(sqlSessionFactory());
sessionTemplate.getConfiguration().addMapper(TestMapper.class); // new code
return sessionTemplate.getMapper(TestMapper.class);
}