带有 MODE=Oracle 的 H2 导致“找不到架构“information_schema””
Posted
技术标签:
【中文标题】带有 MODE=Oracle 的 H2 导致“找不到架构“information_schema””【英文标题】:H2 with MODE=Oracle causes 'Schema "information_schema" not found' 【发布时间】:2017-12-26 12:15:24 【问题描述】:我正在使用 Spring Boot 1.5.4.RELEASE 构建应用程序,我想将 H2 与 Flyway 一起使用。
我的 application.properties 是:
spring.datasource.url=jdbc:h2:mem:test;MODE=Oracle;DB_CLOSE_ON_EXIT=FALSE;DATABASE_TO_UPPER=false;AUTO_RECONNECT=TRUE;INIT=create schema if not exists test;
spring.datasource.username=sa
spring.datasource.password=
spring.h2.console.enabled=true
spring.jpa.generate-ddl=false
spring.jpa.hibernate.ddl-auto=validate
flyway.baseline-version=0.0.1
flyway.sql-migration-prefix=Migration-
flyway.table=SCHEMA_HISTORY
flyway.locations=filesystem:src/schema/bundle
我得到的错误是:
Caused by: org.h2.jdbc.JdbcSQLException: Schema "information_schema" not found; SQL statement:
select SEQUENCE_CATALOG, SEQUENCE_SCHEMA, SEQUENCE_NAME, INCREMENT from information_schema.sequences [90079-195]
at org.h2.message.DbException.getJdbcSQLException(DbException.java:345) ~[h2-1.4.195.jar:1.4.195]
at org.h2.message.DbException.get(DbException.java:179) ~[h2-1.4.195.jar:1.4.195]
at org.h2.message.DbException.get(DbException.java:155) ~[h2-1.4.195.jar:1.4.195]
at org.h2.command.Parser.getSchema(Parser.java:682) ~[h2-1.4.195.jar:1.4.195]
at org.h2.command.Parser.getSchema(Parser.java:688) ~[h2-1.4.195.jar:1.4.195]
at org.h2.command.Parser.readTableFilter(Parser.java:1218) ~[h2-1.4.195.jar:1.4.195]
at org.h2.command.Parser.parseSelectSimpleFromPart(Parser.java:1940) ~[h2-1.4.195.jar:1.4.195]
at org.h2.command.Parser.parseSelectSimple(Parser.java:2089) ~[h2-1.4.195.jar:1.4.195]
at org.h2.command.Parser.parseSelectSub(Parser.java:1934) ~[h2-1.4.195.jar:1.4.195]
at org.h2.command.Parser.parseSelectUnion(Parser.java:1749) ~[h2-1.4.195.jar:1.4.195]
at org.h2.command.Parser.parseSelect(Parser.java:1737) ~[h2-1.4.195.jar:1.4.195]
at org.h2.command.Parser.parsePrepared(Parser.java:448) ~[h2-1.4.195.jar:1.4.195]
at org.h2.command.Parser.parse(Parser.java:320) ~[h2-1.4.195.jar:1.4.195]
at org.h2.command.Parser.parse(Parser.java:292) ~[h2-1.4.195.jar:1.4.195]
at org.h2.command.Parser.prepareCommand(Parser.java:257) ~[h2-1.4.195.jar:1.4.195]
at org.h2.engine.Session.prepareLocal(Session.java:573) ~[h2-1.4.195.jar:1.4.195]
at org.h2.engine.Session.prepareCommand(Session.java:514) ~[h2-1.4.195.jar:1.4.195]
at org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1204) ~[h2-1.4.195.jar:1.4.195]
at org.h2.jdbc.JdbcStatement.executeQuery(JdbcStatement.java:74) ~[h2-1.4.195.jar:1.4.195]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_60]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_60]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_60]
at java.lang.reflect.Method.invoke(Method.java:497) ~[na:1.8.0_60]
at org.apache.tomcat.jdbc.pool.StatementFacade$StatementProxy.invoke(StatementFacade.java:114) ~[tomcat-jdbc-8.5.15.jar:na]
将 spring.jpa.hibernate.ddl-auto 设置为 none 解决了这个问题,但我想保持我的架构针对模型进行验证(已经遇到一个讨厌的错误)。我想这是正确的方法。我错过了什么?
【问题讨论】:
这是您的 ddl 位置吗?src/schema/bundle
@fiskra 正确。我对ddl没有问题。当我在没有架构验证的情况下启动应用程序时,我可以完全访问那里创建的表。
嘿,我知道这有点晚了,但是您是否尝试过删除 url
中的 DATABASE_TO_UPPER=false;
部分?你能解释一下你禁用上层属性的目的吗?
@fiskra 是的。没有任何改变。
您找到解决此问题的方法了吗?我遇到了同样的问题
【参考方案1】:
设置CASE_INSENSITIVE_IDENTIFIERS = true
为我解决了同样的问题。我使用的是 com.h2database 的 1.4.194 版本,这似乎不起作用,但将其更新到 1.4.200 就可以了。
不过,我确实也删除了 INIT=create schema if not exists
参数,让 Spring 通过 spring.jpa.hibernate.ddl-auto
设置创建表,所以不确定这是否也是一个因素。
【讨论】:
【参考方案2】:对我来说问题是由于 h2 版本。我不得不恢复到 v1.4.197,使用这个版本你甚至不需要添加 DATABASE_TO_UPPER=false
【讨论】:
以上是关于带有 MODE=Oracle 的 H2 导致“找不到架构“information_schema””的主要内容,如果未能解决你的问题,请参考以下文章
使用 MyBatis、H2 和 Oracle 程序进行集成测试
在 MODE=MySQL 中运行 h2 不支持 MySQL 转储
使用 H2、JPA 注释和 Hibernate 问题的一对多关联
H2(版本 2.0.202)auto_increment 不起作用
H2:打开连接,更新,关闭连接,现在我所有的更改都消失了吗?
SQLErrorCodes loaded: [DB2, Derby, H2, HSQL, Informix, MS-SQL, MySQL, Oracle, PostgreSQL, Sybase]