我有一个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_DELAY = 1

Hbm2ddl在创建表后关闭连接,因此h2将丢弃它。

如果您像这样配置了connection-url

jdbc:h2:mem:test

在关闭最后一个连接时,数据库的内容将丢失。

如果你想保留你的内容,你必须这样配置url

jdbc:h2:mem:test;DB_CLOSE_DELAY=-1

如果这样做,h2将保留它的内容,只要vm存在。

注意分号(;)而不是冒号(:)。

请参阅功能页面的内存数据库部分。引用:

默认情况下,关闭到数据库的最后一个连接将关闭数据库。对于内存中的数据库,这意味着内容丢失。要保持数据库打开,在数据库URL中添加;DB_CLOSE_DELAY=-1。要在虚拟机处于活动状态时保持内存中数据库的内容,请使用jdbc:h2:mem:test;DB_CLOSE_DELAY=-1。

其他回答

同样的问题,尝试了以上所有方法,但都没有成功。 导致这个错误的一个相当有趣的原因是,在创建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());

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

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

我也遇到了同样的问题,并在应用程序测试中更改了配置。属性:

#Test Properties
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.url=jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1
spring.datasource.username=sa
spring.datasource.password=
spring.jpa.hibernate.ddl-auto=create-drop

和我的依赖:

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>

    <!-- https://mvnrepository.com/artifact/com.h2database/h2 -->
    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
        <version>1.4.198</version>
        <scope>test</scope>
    </dependency>

以及测试类上使用的注释:

@RunWith(SpringRunner.class)
@DataJpaTest
@ActiveProfiles("test")
public class CommentServicesIntegrationTests {
...
}

我已经试着补充了

jdbc:h2:mem:test;DB_CLOSE_DELAY=-1

然而,这并没有帮助。在H2网站上,我发现以下,这确实可以在某些情况下有所帮助。

默认情况下,关闭到数据库的最后一个连接将关闭数据库。对于内存中的数据库,这意味着内容丢失。要保持数据库打开,在数据库URL中添加;DB_CLOSE_DELAY=-1。要在虚拟机处于活动状态时保持内存中数据库的内容,请使用jdbc:h2:mem:test;DB_CLOSE_DELAY=-1。

然而,我的问题是模式应该与默认模式不同。所以不用

JDBC URL: jdbc:h2:mem:test

我不得不使用:

JDBC URL: jdbc:h2:mem:testdb

然后桌子就可见了

   Use the same in applications.properties file
   
   spring.jpa.show-sql=true
   spring.datasource.url=jdbc:h2:mem:testdb;DATABASE_TO_UPPER=false
   DB_CLOSE_ON_EXIT=FALSE
   spring.data.jpa.repositories.bootstrap-mode=default
   spring.h2.console.enabled=true spring.jpa.generate-ddl=true
   spring.jpa.hibernate.ddl-auto=create
   spring.datasource.driverClassName=org.h2.Driver
   spring.jpa.defer-datasource-initialization=true