arquillian 和 flyway:不执行迁移
arquillian and flyway: Migrations are not executed
我对嵌入式 wildfly 进行了 arquillian 测试 运行。即使所有迁移脚本、Integrator class(其中设置了 FlyWay)和所有 flyway 包(来自 POM 文件)都包含在 .war 文件中的 shrinkwrap 中(部署在嵌入式wildfly),没有迁移完成。
这有什么原因吗?这主要是行不通还是我遗漏了什么?
我想实现的是 arquillian 的自动化测试 运行 将使用相同的迁移脚本设置一个与生产数据库具有相同方案的内存数据库。
edit:正如下面 ytg 所问,我添加了 Integrator class;但是,此代码未输入到 arquillian 测试中;如果我在 integrate 方法之上设置一个断点,它永远不会被击中。为什么?
import org.flywaydb.core.Flyway;
import org.flywaydb.core.api.MigrationInfo;
import org.hibernate.cfg.Configuration;
import org.hibernate.engine.spi.SessionFactoryImplementor;
import org.hibernate.integrator.spi.Integrator;
import org.hibernate.metamodel.source.MetadataImplementor;
import org.hibernate.service.spi.SessionFactoryServiceRegistry;
public class FlywayIntegrator implements Integrator
{
@Override
public void integrate(final Configuration configuration,
final SessionFactoryImplementor sessionFactoryImplementor,
final SessionFactoryServiceRegistry sessionFactoryServiceRegistry)
{
System.out.println("Starting Flyway database migrations");
Flyway flywayEvending = new Flyway();
// enable this to migrate from the state currently on useqrnow.com
flywayEvending.setBaselineVersionAsString("0");
flywayEvending.setBaselineOnMigrate(true);
flywayEvending.setDataSource(...)
flywayEvending.setLocations(...);
for (MigrationInfo i : flywayEvending.info().all())
{
System.out.println("migrate task: " + i.getVersion() + " : " + i.getDescription() + " from file: " + i.getScript());
}
flywayEvending.migrate();
}
@Override
public void integrate(final MetadataImplementor metadataImplementor, final SessionFactoryImplementor sessionFactoryImplementor, final SessionFactoryServiceRegistry sessionFactoryServiceRegistry)
{
// do nothing
}
@Override
public void disintegrate(final SessionFactoryImplementor sessionFactoryImplementor, final SessionFactoryServiceRegistry sessionFactoryServiceRegistry)
{
// do nothing
}
}
隔了好久,重试解决了这个问题。这很简单:我错过了添加文件 META-INF/services/org.hibernate.integrator.spi.Integrator
,我们必须在其中存储积分器 class。我需要将此文件添加到 ShrinkWrap
创建的 .war。
我对嵌入式 wildfly 进行了 arquillian 测试 运行。即使所有迁移脚本、Integrator class(其中设置了 FlyWay)和所有 flyway 包(来自 POM 文件)都包含在 .war 文件中的 shrinkwrap 中(部署在嵌入式wildfly),没有迁移完成。
这有什么原因吗?这主要是行不通还是我遗漏了什么?
我想实现的是 arquillian 的自动化测试 运行 将使用相同的迁移脚本设置一个与生产数据库具有相同方案的内存数据库。
edit:正如下面 ytg 所问,我添加了 Integrator class;但是,此代码未输入到 arquillian 测试中;如果我在 integrate 方法之上设置一个断点,它永远不会被击中。为什么?
import org.flywaydb.core.Flyway;
import org.flywaydb.core.api.MigrationInfo;
import org.hibernate.cfg.Configuration;
import org.hibernate.engine.spi.SessionFactoryImplementor;
import org.hibernate.integrator.spi.Integrator;
import org.hibernate.metamodel.source.MetadataImplementor;
import org.hibernate.service.spi.SessionFactoryServiceRegistry;
public class FlywayIntegrator implements Integrator
{
@Override
public void integrate(final Configuration configuration,
final SessionFactoryImplementor sessionFactoryImplementor,
final SessionFactoryServiceRegistry sessionFactoryServiceRegistry)
{
System.out.println("Starting Flyway database migrations");
Flyway flywayEvending = new Flyway();
// enable this to migrate from the state currently on useqrnow.com
flywayEvending.setBaselineVersionAsString("0");
flywayEvending.setBaselineOnMigrate(true);
flywayEvending.setDataSource(...)
flywayEvending.setLocations(...);
for (MigrationInfo i : flywayEvending.info().all())
{
System.out.println("migrate task: " + i.getVersion() + " : " + i.getDescription() + " from file: " + i.getScript());
}
flywayEvending.migrate();
}
@Override
public void integrate(final MetadataImplementor metadataImplementor, final SessionFactoryImplementor sessionFactoryImplementor, final SessionFactoryServiceRegistry sessionFactoryServiceRegistry)
{
// do nothing
}
@Override
public void disintegrate(final SessionFactoryImplementor sessionFactoryImplementor, final SessionFactoryServiceRegistry sessionFactoryServiceRegistry)
{
// do nothing
}
}
隔了好久,重试解决了这个问题。这很简单:我错过了添加文件 META-INF/services/org.hibernate.integrator.spi.Integrator
,我们必须在其中存储积分器 class。我需要将此文件添加到 ShrinkWrap
创建的 .war。