我有一个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]。我可能错过了一些简单的东西,但任何帮助将不胜感激。


当前回答

我已经尝试了上面的解决方案,但在我的情况下,在控制台中添加属性DB_CLOSE_ON_EXIT=FALSE,它修复了这个问题。

 spring.datasource.url=jdbc:h2:mem:testdb;DATABASE_TO_UPPER=false;DB_CLOSE_ON_EXIT=FALSE

其他回答

<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>

通过创建一个新的src/test/resources文件夹+插入应用程序来解决。属性文件,显式指定创建test dbase:

spring.jpa.generate-ddl=true
spring.jpa.hibernate.ddl-auto=create

如果在生成表时出现错误,也会发生此问题。

如果实体使用了H2不支持的任何特性(例如,指定了一个非标准的columnDefinition),模式生成将失败,测试将在不生成数据库的情况下继续进行。

在这种情况下,在日志的某个地方你会发现:

WARN ExceptionHandlerLoggedImpl: GenerationTarget encountered exception accepting command :
 Error executing DDL "create table ..." via JDBC Statement

同样的问题,尝试了以上所有方法,但都没有成功。 导致这个错误的一个相当有趣的原因是,在创建DB表之前,JVM启动得太快了(使用data。src.main.resources中的SQL文件)。所以我设置了一个Thread.sleep(1000)定时器,在调用“select * from person”之前等待一秒钟。 现在工作完美无缺。

application.properties:

spring.h2.console.enabled=true
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=

data.sql:

create table person
(
id integer not null,
name varchar(255) not null,
location varchar(255),
birth_date timestamp,
primary key(id)
);

insert into person values (
10001, 'Tofu', 'home', sysdate()
);

PersonJdbcDAO.java:

    public List<Person> findAllPersons(){
    return jdbcTemplate.query("select * from person", 
        new BeanPropertyRowMapper<Person>(Person.class));
}

主要课程:

Thread.sleep(1000);
logger.info("All users -> {}", dao.findAllPersons());

我可能有点晚了,但我遇到了完全相同的错误,我尝试了这里提到的每个解决方案和其他网站,如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)

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