H2数据库仅在文件

时间:2017-09-26 08:14:45

标签: java spring hibernate h2

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

我为测试创建了单独的配置文件(Spring和Hibernate) 一切顺利,直到我尝试打入内存数据库

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:

有关

如果我使用:

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

等等......

对我而言,在这种情况下,数据库是生成的,不知何故我正在工作或者在不同的实例上发生了某些事情,并且在创建和测试之间删除了表。

这种情况似乎不太可能,因为没有Hibernate日志来指示这一点(没有丢弃查询)测试日志在创建日志之后立即启动

我在这里发现了类似的问题:H2 in-mem-DB with hibernate set to create giving me table not found errors

但是解决方案是使用文件。

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

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

感谢。

4 个答案:

答案 0 :(得分:2)

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

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

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

H2 documentation提供了有关这些设置的更多详细信息。

答案 1 :(得分:0)

可以显示与测试相关的所有配置文件。你有没有名为&#34; test&#34;的表,因为在url&#34; .. test&#34;表示数据源

you can find some tips here

答案 2 :(得分:0)

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

如上所述here,可以向数据库URL添加显式相对文件路径。

我最终做的是将DATABASE_URL设置为:

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

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

答案 3 :(得分:0)

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