[英]H2 database doesn't work in memory only with file
我有一个与Hibernate一起建立的Spring MVC项目,并想为某些服务创建一些测试。 主应用程序使用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:
如果我使用:
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在内存数据库中设置了休眠模式,以创建给我的表未找到错误
但是那里的解决方案是使用文件。
这不是我的解决方案,因为这些测试必须在运行不同操作系统的许多计算机上执行,因此硬编码路径文件不是一个选择。 而且JDBC不允许相对路径,因此我可以将数据库文件放在resources文件夹中。
有谁知道如何解决这个问题?
谢谢。
我遇到了同样的问题,最终找到了解决方案:这是因为在初始化数据库之后,它再次关闭。 但是,使用标准设置,这将导致删除数据库。 当您在测试中再次连接相同的URL时,您将拥有一个“新”实例,其中包含所有创建的表。
您可以通过在JDBC URL的末尾附加“; DB_CLOSE_DELAY = -1”来防止关闭数据库。例如
jdbc:h2:mem:test;DB_CLOSE_DELAY=-1
H2文档提供了有关这些设置的更多详细信息。
您可以显示与测试相关的所有配置文件吗? 您是否有一个名为“ test”的表,因为在URL中“ ..test”表示数据源
最后,我没有使用内存数据库,而是使用了一个文件。
如此处所述,可以向数据库url添加一个明确的相对文件路径。
我最终要做的是将DATABASE_URL设置为:
DATABASE_URL = "jdbc:h2:file:./src/test/resources/test";
这将在resources文件夹中创建一个数据库文件,这是完全可以接受的。
用数据库名称创建一个文件。 示例:test.h2.db
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.