Java H2数据库没有';t仅使用文件在内存中工作

Java H2数据库没有';t仅使用文件在内存中工作,java,spring,hibernate,h2,Java,Spring,Hibernate,H2,我有一个用Hibernate设置的SpringMVC项目,希望为一些服务创建一些测试。 主应用程序使用PostgreSQL数据库,对于测试,我想使用内存中的H2数据库 我为测试创建了单独的配置文件(Spring和Hibernate) 在我尝试访问内存中的数据库之前,一切都很正常 休眠配置: @Configuration @EnableTransactionManagement @EnableJpaRepositories("<repository>") public class Da

我有一个用Hibernate设置的SpringMVC项目,希望为一些服务创建一些测试。 主应用程序使用PostgreSQL数据库,对于测试,我想使用内存中的H2数据库

我为测试创建了单独的配置文件(Spring和Hibernate) 在我尝试访问内存中的数据库之前,一切都很正常

休眠配置:

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories("<repository>")
public class DataSourceTestConfig {

private static final Logger LOG = LogManager.getLogger(DataSourceTestConfig.class);

private static final String DATABASE_DRIVER = "org.h2.Driver";
//private static final String DATABASE_URL = "jdbc:h2:file:d:/test";
private static final String DATABASE_URL = "jdbc:h2:mem:test";
private static final String DATABASE_USERNAME = "sa";
private static final String DATABASE_PASSWORD = "";

private static final String HIBERNATE_DIALECT = "org.hibernate.dialect.H2Dialect";
private static final String HIBERNATE_SHOW_SQL = "true";
private static final String ENTITYMANAGER_PACKAGES_TO_SCAN = "<packages>";
private static final String HIBERNATE_HBM2DDL_AUTO = "create";
...
一切正常。所有测试都按它们应该的方式运行

如果我使用:

DATABASE_URL = "jdbc:h2:file:d:/test";
DATABASE_URL = "jdbc:h2:mem:test";
所有的地狱都松开了,它不起作用:)

在这种情况下,我得到

 org.h2.jdbc.JdbcSQLException: Table "test" not found; SQL statement: ...
通过Hibernate日志可以清楚地看到,表实际上是生成的:

 DEBUG org.hibernate.SQL - drop table test if exists
 ...
 DEBUG org.hibernate.SQL - create table test (<columns>)
 ...
 DEBUG org.hibernate.SQL - alter table test add constraint FKg74a38x6t762qifuge9cux03i foreign key ...
DEBUG org.hibernate.SQL-删除表测试(如果存在)
...
DEBUG org.hibernate.SQL-创建表测试()
...
调试org.hibernate.SQL-更改表测试添加约束FKg74a38x6t762qifuge9cux03i外键。。。
等等

在我看来,在这种情况下,数据库是生成的,不知何故,我正在工作或处理另一个实例,或者发生了什么事情,表在创建和测试之间被删除

在我看来,这些场景似乎不太可能,因为没有Hibernate日志表明这一点(没有删除查询)。测试日志在创建日志之后立即启动

我在这里发现了类似的问题:

但解决方案是使用文件

这对我来说不是一个解决方案,因为这些测试必须在运行不同操作系统的许多机器上执行,所以硬编码路径文件不是一个选项。而且JDBC不允许相对路径,因此我可以将数据库文件放在resources文件夹中

有人知道如何解决这个问题吗


谢谢。

能否显示与测试相关的所有配置文件。您是否有名为“test”的表,因为在url中“.test”表示数据源


作为结论,我最终没有使用内存数据库,而是使用文件数据库

如前所述,可以向数据库url添加显式的相对文件路径

我最后做的是将数据库的URL设置为:

 DATABASE_URL = "jdbc:h2:file:./src/test/resources/test";

这将在resources文件夹中创建一个数据库文件,这是完全可以接受的。

我遇到了同样的问题,并最终找到了解决方案:这是因为在初始化数据库后,它会再次关闭。但是,对于标准设置,这会导致删除DB。当在测试中再次连接相同的URL时,您将有一个“fresh”实例,其中包含我们创建的任何表

您可以通过在JDBCURL的末尾附加“DB_CLOSE_DELAY=-1”来防止数据库关闭,例如

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

提供了有关这些设置的详细信息。

使用数据库名称创建一个文件。
示例:test.h2.db

您是否使用相同的连接来创建架构和运行测试?是的,在工作的测试(使用文件配置)和不工作的测试(使用mem配置)之间,我唯一要更改的是数据库\u URL属性如何/在何处设置属性?属性的设置和测试的配置可能有问题。我正在通过Java中的注释配置Spring和Hibernate。它们主要是从主应用程序的配置中复制粘贴。刚刚将数据库连接属性更改为使用H2。在调试时,属性似乎设置正确,并且日志显示表是按预期生成的。当执行查询时,它们似乎不可用。嗨,如果我发布所有与测试相关的类,帖子会变得相当长。“test”表和数据库名称只是为了可读性。实际的表名和数据库名是不同的,它们之间没有混淆。另外,问题是,当我将数据库url更改为使用h2:mem时,一切都会崩溃。如果我将配置留给h2:file,那么一切都正常(使用数据库的测试超过50次)