在两个SQLSessionFactory bean之一上使用@Primary时,出现“ java.sql.SQLSyntaxErrorException:ORA-00942:表或视图不存在”

时间:2018-11-28 05:35:05

标签: java spring oracle spring-mvc mybatis

我有两个适当的数据源,它们分别工作正常。但是,当我在两个SqlSessionFactory之一上使用@Primary时,另一个开始引发下面提到的异常:

  

线程“主”中的异常   org.springframework.beans.factory.BeanCreationException:错误   创建名称为“ pServiceImpl”的bean:的调用   初始化方法失败;嵌套异常为   org.springframework.jdbc.BadSqlGrammarException:查询错误   数据库。原因:java.sql.SQLSyntaxErrorException:ORA-00942:表   或视图不存在

     

该错误可能存在于com / abc / def / mapper / pMapper.java中(最佳猜测)

     

该错误可能涉及defaultParameterMap

     

设置参数时发生错误

     

SQL:选择C.CONTACT_ID,C.REF_ID,S.P_ID,S.COURIER_P_NUM,S.SENDER_ADDR_ID,S.CREATION_TS,   来自P_EVENT_TRACKING SE,PS的CA.CONTACT_ADDR_ID,   CONTACT_ADDR CA,CONTACT C,其中SE.EVENT_CD ='PICKUP'和   SE.P_ID = s.p_id和S.SENDER_ADDR_ID =   CA.CONTACT_ADDR_ID和CA.CONTACT_ID = c.contact_id和C.GROUP_CD =   'OT'和SE.EVENT_OCCURRED_IND ='N'和S.CREATION_TS> =(选择   CURRENT_TIMESTAMP-从双开始间隔'30'天   S.SCHEDULE_PICKUP_IND ='Y'

     

原因:java.sql.SQLSyntaxErrorException:ORA-00942:表或视图不存在

     

;错误的SQL语法[];嵌套异常为   java.sql.SQLSyntaxErrorException:ORA-00942:表或视图不   存在

     在

  org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization(InitDestroyAnnotationBeanPostProcessor.java:137)     在   org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization(AbstractAutowireCapableBeanFactory.java:409)     在   org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1620)     在   org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:555)     在   org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)     在   org.springframework.beans.factory.support.AbstractBeanFactory $ 1.getObject(AbstractBeanFactory.java:306)     在   org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)     在   org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)     在   org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)     在   org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:761)     在   org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:867)     在   org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:543)     在   org.springframework.context.annotation.AnnotationConfigApplicationContext。(AnnotationConfigApplicationContext.java:84)     在   com.abc.def.app.starter.Pickup.main(Pickup.java:11)   引起原因:org.springframework.jdbc.BadSqlGrammarException:

     

查询数据库时出错。原因:java.sql.SQLSyntaxErrorException:ORA-00942:表或视图不存在

     

该错误可能存在于com / abc / def / mapper / PMapper.java中(最佳猜测)

     

该错误可能涉及defaultParameterMap

     

设置参数时发生错误

     

SQL:选择C.CONTACT_ID,C.REF_ID,S.P_ID,S.COURIER_P_NUM,S.SENDER_ADDR_ID,S.CREATION_TS,   来自P_EVENT_TRACKING SE,PS的CA.CONTACT_ADDR_ID,   CONTACT_ADDR CA,CONTACT C,其中SE.EVENT_CD ='PICKUP'和   SE.P_ID = s.p_id和S.SENDER_ADDR_ID =   CA.CONTACT_ADDR_ID和CA.CONTACT_ID = c.contact_id和C.GROUP_CD =   'OT'和SE.EVENT_OCCURRED_IND ='N'和S.CREATION_TS> =(选择   CURRENT_TIMESTAMP-从双开始间隔'30'天   S.SCHEDULE_PICKUP_IND ='Y'

     

原因:java.sql.SQLSyntaxErrorException:ORA-00942:表或视图不存在

     

;错误的SQL语法[];嵌套异常为   java.sql.SQLSyntaxErrorException:ORA-00942:表或视图不   存在

     在

  org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:231)     在   org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:73)     在   org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:73)     在   org.mybatis.spring.SqlSessionTemplate $ SqlSessionInterceptor.invoke(SqlSessionTemplate.java:446)     在com.sun.proxy。$ Proxy26.selectList(未知源)处   org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:230)     在   org.apache.ibatis.binding.MapperMethod.executeForMany(MapperMethod.java:137)     在   org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:75)     在org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:59)     在com.sun.proxy。$ Proxy32.findPByOutlet(未知来源)处   com.abc.def.dao.PDAOImpl.getPByOutlet(PDAOImpl.java:23)     在   com.abc.def.service.PickupServiceImpl.startExecution(PickupServiceImpl.java:62)     在   com.abc.def.service.PickupServiceImpl.execute(PickupServiceImpl.java:46)     在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处   sun.reflect.NativeMethodAccessorImpl.invoke(未知来源)位于   sun.reflect.DelegatingMethodAccessorImpl.invoke(未知源)位于   java.lang.reflect.Method.invoke(来源未知)   org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor $ LifecycleElement.invoke(InitDestroyAnnotationBeanPostProcessor.java:366)     在   org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor $ LifecycleMetadata.invokeInitMethods(InitDestroyAnnotationBeanPostProcessor.java:311)     在   org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization(InitDestroyAnnotationBeanPostProcessor.java:134)     ...还有13个

2 个答案:

答案 0 :(得分:2)

如果更改@Primary注释的位置可以解决此问题,则意味着在您的Spring配置中,您将SqlSessionFactory的类型使用自动装配成{{ 1}}或根据SqlSessionTemplatePDAOImpl的类型自动布线。

确保您明确指定正确的依赖项。

您会收到此错误,因为SqlSessionTemplate使用了错误的PDAOImpl,这会导致不具有该表的数据库被调用。

答案 1 :(得分:0)

这样对我有用。删除了映射器的自动注册(即@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);
    }