我有一个包含两个模块的项目。这两个模块都使用 flyway 进行数据库的迁移和初始设置。这两个项目都是独立的。我还在每个模块中进行了测试。每当我运行两个模块,或者只运行一个模块的一个测试时,迁移可能不会执行。模块一包含
- abcaccount.persistence.jdbc.migrations.Vaccount_1__CreateStructure.java abcaccount.persistence.jdbc.migrations.Vaccount_2__CreateIndexOnName.sql ... abcaccount.persistence.jdbc.migrations.Vaccount_5__AddDAOCreatedAndUpdated.sql
和 JDBCAccountPersistenceServiceImpl 和 JDBCAccountPersistenceServiceImplTest。
模块二包含
- abcauthentication.persistence.jdbc.migrations.Vauth_1__CreateTableForPasswords.sql abcauthentication.persistence.jdbc.JDBCAuthenticationPersistenceServiceImpl
和 JDBCAuthenticationPersistenceServiceImplTest。
两个 Impls 共享一个父类,在其 init 方法中调用:
//prepare db.
Flyway flyway = new Flyway();
flyway.setDataSource(getDataSource());
flyway.setLocations(getClass().getPackage().getName()+".migrations");
flyway.migrate();
如果在干净的数据库和填充的数据库上分别启动,这两个测试都可以工作。但是,如果我清理数据库并从 intellij 运行测试并首先运行 JDBCAuthenticationPersistenceServiceImplTest,则另一个测试将失败:
org.postgresql.util.PSQLException: ERROR: relation "account" does not exist
Position: 13
at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2103)
在这种情况下,schema_version 将只包含一行:
1 | 1 | auth.1 | CreateTableForPasswords | SQL | Vauth_1__CreateTableForPasswords.sql | -1961897674 | another | 2013-01-14 23:39:00.736033 | 18 | t
如果我手动删除所有表,测试将再次运行。如果我在干净的数据库(maven)上从控制台运行测试,它也可以工作。我究竟做错了什么?难道 auth.1 被认为是比 account.1 更高的版本,因此 account.1 补丁没有被执行?