简体   繁体   English

Spring boot + flyway + H2 in memory:Caused by: org.h2.jdbc.JdbcSQLException: Table "xxxx" not found; SQL 声明:

[英]Spring boot + flyway + H2 in memory :Caused by: org.h2.jdbc.JdbcSQLException: Table "xxxx" not found; SQL statement:

I am using H2 as in memory database in a spring boot project for unit testing.我在 spring 引导项目的 memory 数据库中使用 H2 进行单元测试。 However I am getting below error但是我遇到了以下错误

Caused by: org.hibernate.exception.SQLGrammarException: could not prepare statement
    at org.hibernate.exception.internal.SQLStateConversionDelegate.convert(SQLStateConversionDelegate.java:123)
    at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:49)
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:126)
    at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$StatementPreparationTemplate.prepareStatement(StatementPreparerImpl.java:196)
    at org.hibernate.engine.jdbc.internal.StatementPreparerImpl.prepareQueryStatement(StatementPreparerImpl.java:160)
    at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1885)
    at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1862)
    at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1839)
    at org.hibernate.loader.Loader.doQuery(Loader.java:910)
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:355)
    at org.hibernate.loader.Loader.doList(Loader.java:2554)
    at org.hibernate.loader.Loader.doList(Loader.java:2540)
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2370)
    at org.hibernate.loader.Loader.list(Loader.java:2365)
    at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:497)
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:387)
    at org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:236)
    at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1300)
    at org.hibernate.internal.QueryImpl.list(QueryImpl.java:103)
    at org.hibernate.jpa.internal.QueryImpl.list(QueryImpl.java:573)
    at org.hibernate.jpa.internal.QueryImpl.getSingleResult(QueryImpl.java:495)
    at org.hibernate.jpa.criteria.compile.CriteriaQueryTypeQueryAdapter.getSingleResult(CriteriaQueryTypeQueryAdapter.java:71)
    at org.springframework.data.jpa.repository.query.JpaQueryExecution$SingleEntityExecution.doExecute(JpaQueryExecution.java:202)
    at org.springframework.data.jpa.repository.query.JpaQueryExecution.execute(JpaQueryExecution.java:74)
    at org.springframework.data.jpa.repository.query.AbstractJpaQuery.doExecute(AbstractJpaQuery.java:97)
    at org.springframework.data.jpa.repository.query.AbstractJpaQuery.execute(AbstractJpaQuery.java:88)
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.doInvoke(RepositoryFactorySupport.java:395)
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:373)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$DefaultMethodInvokingMethodInterceptor.invoke(RepositoryFactorySupport.java:486)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
    at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99)
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:281)
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
    at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:136)
    ... 80 more
Caused by: org.h2.jdbc.JdbcSQLException: Table "cm_user" not found; SQL statement:
select user0_.id as id1_6_, user0_.created_by as created16_6_, user0_.created_date as created_2_6_, user0_.last_modified_by as last_mo17_6_, user0_.last_modified_date as last_mod3_6_, user0_.status as status4_6_, user0_.version as version5_6_, user0_.avatar_name as avatar_n6_6_, user0_.avatar_url as avatar_u7_6_, user0_.dob as dob8_6_, user0_.email as email9_6_, user0_.failed_login_attempt as failed_10_6_, user0_.first_name as first_n11_6_, user0_.gender as gender12_6_, user0_.last_name as last_na13_6_, user0_.last_password_update_date as last_pa14_6_, user0_.password as passwor15_6_ from cm_user user0_ where user0_.email=? [42102-187]
    at org.h2.message.DbException.getJdbcSQLException(DbException.java:345)
    at org.h2.message.DbException.get(DbException.java:179)
    at org.h2.message.DbException.get(DbException.java:155)
    at org.h2.command.Parser.readTableOrView(Parser.java:5261)
    at org.h2.command.Parser.readTableFilter(Parser.java:1235)
    at org.h2.command.Parser.parseSelectSimpleFromPart(Parser.java:1874)
    at org.h2.command.Parser.parseSelectSimple(Parser.java:1983)
    at org.h2.command.Parser.parseSelectSub(Parser.java:1868)
    at org.h2.command.Parser.parseSelectUnion(Parser.java:1689)
    at org.h2.command.Parser.parseSelect(Parser.java:1677)
    at org.h2.command.Parser.parsePrepared(Parser.java:433)
    at org.h2.command.Parser.parse(Parser.java:305)
    at org.h2.command.Parser.parse(Parser.java:277)
    at org.h2.command.Parser.prepareCommand(Parser.java:242)
    at org.h2.engine.Session.prepareLocal(Session.java:461)
    at org.h2.engine.Session.prepareCommand(Session.java:403)
    at org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1189)
    at org.h2.jdbc.JdbcPreparedStatement.<init>(JdbcPreparedStatement.java:72)
    at org.h2.jdbc.JdbcConnection.prepareStatement(JdbcConnection.java:277)
    at org.apache.tomcat.jdbc.pool.ProxyConnection.invoke(ProxyConnection.java:126)
    at org.apache.tomcat.jdbc.pool.JdbcInterceptor.invoke(JdbcInterceptor.java:108)
    at org.apache.tomcat.jdbc.pool.DisposableConnectionFacade.invoke(DisposableConnectionFacade.java:81)
    at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$5.doPrepare(StatementPreparerImpl.java:162)
    at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$StatementPreparationTemplate.prepareStatement(StatementPreparerImpl.java:186)
    ... 112 more

By configuration is as below通过配置如下

spring.datasource.url =jdbc:h2:mem:test;DB_CLOSE_ON_EXIT=FALSE;AUTO_RECONNECT=TRUE;DATABASE_TO_UPPER=false;INIT=create schema if not exists test;
spring.datasource.username = sa
spring.datasource.password =
spring.datasource.driverClassName = org.h2.Driver

# Specify the DBMS
spring.jpa.database =

# Show or not log for each sql query
spring.jpa.show-sql = false



#flyway.check-location=true
flyway.locations=classpath:db/migration/mysql
flyway.schemas=test

In combination of spring-boot, flyway and H2 I have some simular problems to find tables in other schemas than default PUBLIC schema. 结合spring-boot,flyway和H2,我有一些类似的问题来查找其他模式中的表而不是默认的PUBLIC模式。

My fix for this problem is: 我对这个问题的解决方法是:

  • add as first script V1.0.1__create_schema.sql 添加为第一个脚本V1.0.1__create_schema.sql

     create schema if not exists test; 
  • use allways full qualifier in procedure, functions and statements 在过程,函数和语句中使用allways full限定符

     create table test.my_table; 

Or use the H2 default schema for test databases instead. 或者使用H2默认架构代替测试数据库。

 flyway.schemas=PUBLIC

This is a pretty old question but I've just bumped into this very same issue in 2021. I managed to sort it out by just adding DB_CLOSE_DELAY=-1 to the connection string as documented here :这是一个很老的问题,但我刚刚在 2021 年遇到了同样的问题。我设法通过将DB_CLOSE_DELAY=-1添加到连接字符串解决这个问题,如下所述:

Here is my application.yaml:这是我的申请。yaml:

spring:
  flyway:
    url: jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1
    baseline-on-migrate: true
    user: sa
    password:

Try to set db url for flyway in test .properties : 尝试在test .properties中为flyway设置db url:

spring.datasource.url = jdbc:h2:mem:DBNAME
spring.datasource.username = sa
spring.flyway.url = jdbc:h2:mem:DBNAME
spring.flyway.baseline-on-migrate = true

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 Spring Boot 2迁移-org.h2.jdbc.JdbcSQLException:找不到序列 - Spring Boot 2 Migration - org.h2.jdbc.JdbcSQLException: Sequence not found org.h2.jdbc.JdbcSQLException:未找到架构“MYAPP”; SQL语句 - org.h2.jdbc.JdbcSQLException: Schema “MYAPP” not found; SQL statement H2 org.h2.jdbc.JdbcSQLException与正确的DDL sql:错误代码= [42000-196] - H2 org.h2.jdbc.JdbcSQLException with correct DDL sql : error code = [42000-196] org.h2.jdbc.JdbcSQLException:未找到架构“SYS”; SQL 声明:select 来自 sys.sequences [90079-192] 的名称 - org.h2.jdbc.JdbcSQLException: Schema "SYS" not found; SQL statement: select name from sys.sequences [90079-192] org.h2.jdbc.JdbcSQLException:在视图+ H2数据库1.4.190 + Hibernate 4.2.0.Final上找不到“ X”列 - org.h2.jdbc.JdbcSQLException: Column “X” not found on view + H2 Database 1.4.190 + Hibernate 4.2.0.Final 找不到表“BATCH_JOB_INSTANCE”:org.h2.jdbc.JdbcSQLException - Table "BATCH_JOB_INSTANCE" not found: org.h2.jdbc.JdbcSQLException org.h2.jdbc.JdbcSQLException:未知数据类型:“DATEADD”; SQL 声明 - org.h2.jdbc.JdbcSQLException: Unknown data type: "DATEADD"; SQL statement H2用户定义的函数org.h2.jdbc.JdbcSQLException非十六进制字符错误 - H2 user-defined-function org.h2.jdbc.JdbcSQLException non-hex character error EmbeddedDatabaseBuilder和org.h2.jdbc.JdbcSQLException:错误的用户名或密码 - EmbeddedDatabaseBuilder & org.h2.jdbc.JdbcSQLException: Wrong user name or password org.h2.jdbc.JdbcSQLException:列“ID”不允许NULL - org.h2.jdbc.JdbcSQLException: NULL not allowed for column “ID”
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM