我有一个使用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也不允许相对路径,因此我可以将数据库文件放在资源文件夹中。
有没有人知道如何解决这个问题?
感谢。
答案 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;表示数据源
答案 2 :(得分:0)
作为结论,我并没有最终使用内存数据库,而是使用文件数据。
如上所述here,可以向数据库URL添加显式相对文件路径。
我最终做的是将DATABASE_URL设置为:
DATABASE_URL = "jdbc:h2:file:./src/test/resources/test";
这会在资源文件夹中创建一个数据库文件,这是完全可以接受的。
答案 3 :(得分:0)
使用数据库名称创建文件。 示例:test.h2.db