【问题标题】:"java.sql.SQLSyntaxErrorException: ORA-00942: table or view does not exist" when using @Primary on one of the two SQLSessionFactory bean在两个 SQLSessionFactory bean 之一上使用 @Primary 时出现“java.sql.SQLSyntaxErrorException:ORA-00942:表或视图不存在”
【发布时间】:2019-04-29 23:11:34
【问题描述】:

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

线程“main”中的异常 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、 CA.CONTACT_ADDR_ID 来自 P_EVENT_TRACKING SE, P S, 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、 CA.CONTACT_ADDR_ID 来自 P_EVENT_TRACKING SE, P S, 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(Unknown Source) 在 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(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at 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 更多

【问题讨论】:

  • 你可能认为'P'是有效的表名(比如说POWER),我只是重命名了它,因为我不能公布真实的名字。此外,SQL 查询是正确的,因为当我从第一个删除注释并使用 @Primary 放置在第二个 SQLSessionFactory 上时它工作正常

标签: java spring oracle spring-mvc mybatis


【解决方案1】:

它像这样对我有用。去掉了mapper的自动注册(即@Mapper),在SQLSessionTemplate手动注册了Mapper,如下图:

 @Bean
    public TestMapper testMapper() throws Exception {
        SqlSessionTemplate sessionTemplate = new SqlSessionTemplate(sqlSessionFactory());        
        sessionTemplate.getConfiguration().addMapper(TestMapper.class); // new code
        return sessionTemplate.getMapper(TestMapper.class);
    }

【讨论】:

    【解决方案2】:

    如果更改 @Primary 注释的位置可以解决此问题,则意味着在您的 spring 配置中,您正在使用 SqlSessionFactory 类型的自动装配到 SqlSessionTemplate 使用的 SqlSessionTemplate 或自动装配类型SqlSessionTemplate 中的 PDAOImpl

    确保明确指定正确的依赖关系。

    您收到此错误是因为PDAOImpl 使用了不正确的SqlSessionFactory,这会调用没有该表的数据库。

    【讨论】:

    • 感谢您解释问题。
    猜你喜欢
    • 2020-03-02
    • 2020-07-19
    • 1970-01-01
    • 2019-01-22
    • 2019-09-29
    • 2015-11-09
    • 2011-12-10
    • 2019-11-22
    • 2015-07-11
    相关资源
    最近更新 更多