我有一个H2数据库的URL“jdbc: H2:test”。我使用create table PERSON (ID INT主键,名字VARCHAR(64),姓VARCHAR(64));;然后使用select * from PERSON从这个(空)表中选择所有内容。到目前为止,一切顺利。

然而,如果我将URL更改为“jdbc:h2:mem:test”,唯一的区别是数据库现在只在内存中,这给了我一个org.h2.jdbc。JdbcSQLException:表“PERSON”未找到;SQL语句:SELECT * FROM PERSON[42102-154]。我可能错过了一些简单的东西,但任何帮助将不胜感激。


当前回答

我可能有点晚了,但我遇到了完全相同的错误,我尝试了这里提到的每个解决方案和其他网站,如DATABASE_TO_UPPER=false;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT = FALSE;IGNORECASE = TRUE

但对我来说什么都不管用。 对我有用的是重命名数据。导入。SQL

我在这里找到的——https://stackoverflow.com/a/53179547/8219358

Or

对于Spring Boot 2.4+,在应用程序中使用Spring .jpa.defer-datasource-initialization=true。属性(此处提到- https://stackoverflow.com/a/68086707/8219358)

我意识到其他解决方案更合乎逻辑,但没有一个对我有效,而这个却管用。

其他回答

在我的例子中,我为表H2 Database中的列名使用了特殊的关键字。如果您正在使用不同的数据库,则避免在不同的数据库中使用这些特殊的关键字。Spring和Hibernate不够聪明,不能准确地告诉您哪些列名是禁止的,或者在表创建过程中哪里出现了错误。 关键词如;

描述,间隔,度量

为了解决我遇到的问题,我将这些字段重命名为:

Descr, time_interval, time_metric

http://www.h2database.com/html/advanced.html

我试图获取表元数据,但有以下错误:

使用:

String JDBC_URL = "jdbc:h2:mem:test;DB_CLOSE_DELAY=-1";

DatabaseMetaData metaData = connection.getMetaData();
...
metaData.getColumns(...);

返回一个空的ResultSet。

但是使用下面的URL可以正常工作:

String JDBC_URL = "jdbc:h2:mem:test;DB_CLOSE_DELAY=-1;DATABASE_TO_UPPER=false";

需要指定:DATABASE_TO_UPPER=false

一个原因可能是jpa试图在创建表结构之前插入数据,为了解决这个问题,在应用程序中插入这一行。属性:

spring.jpa.defer-datasource-initialization=true
<bean id="benchmarkDataSource"
    class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="org.h2.Driver" />
    <property name="url" value="jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1" />
    <property name="username" value="sa" />
    <property name="password" value="" />
</bean>

在我的情况下,缺少表错误发生在jpa测试期间,表是由方案创建的。SQL文件,问题在放置@org.springframework.transaction.annotation后被修复。测试中的事务性