我有一個使用Hibernate設置的Spring MVC項目,並且想爲某些服務創建一些測試。 主要的應用程序使用PostgreSQL數據庫和測試,我想使用H2內存數據庫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不允許相對路徑,以便我可以將數據庫文件放在資源文件夾中。
有沒有人有一個想法如何解決這個問題?
謝謝。
您是否使用相同的連接來創建模式並運行測試? –
是的,在工作(使用文件配置)和不工作(使用mem配置)的測試之間,唯一改變的是DATABASE_URL屬性 – eXtreme
如何/在哪裏設置屬性?也許有關如何設置屬性和測試配置有問題。 – msparer