Flyway的CDI扩展

时间:2012-06-17 13:57:18

标签: cdi ejb-3.1 flyway

我试图在我的应用程序中运行flyway,然后hibernate挂钩我的JBoss AS 7.1。我尝试使用@javax.ejb.Startup注释,但是在初始化Hibernate并检查数据库方案后执行此操作。

据我所知,我们可以使用在初始化Hibernate之前挂钩的CDI扩展。对飞路的开箱即用有什么支持吗?如果没有,有没有人试过这样做呢?

2 个答案:

答案 0 :(得分:34)

好的,我终于找到了如何做到这一点:我不得不使用Hibernate Integration API。这是我必须编写的完整代码:

public class FlywayIntegrator implements Integrator {

  @Override
  public void integrate(final Configuration configuration, final SessionFactoryImplementor sessionFactoryImplementor, final SessionFactoryServiceRegistry sessionFactoryServiceRegistry) {
    final Flyway flyway = new Flyway();

    flyway.setDataSource(....);
    flyway.migrate();
  }

  @Override
  public void integrate(final MetadataImplementor metadataImplementor, final SessionFactoryImplementor sessionFactoryImplementor, final SessionFactoryServiceRegistry sessionFactoryServiceRegistry) {
    //no-op
  }

  @Override
  public void disintegrate(final SessionFactoryImplementor sessionFactoryImplementor, final SessionFactoryServiceRegistry sessionFactoryServiceRegistry) {
    //no-op
  }
}

如果有人对更多细节感兴趣,我创建了一个github项目,该项目证明:https://github.com/dobermai/Hibernate-Flyway-Integration

答案 1 :(得分:1)

CDI定义了自己的生命周期,该生命周期在应用程序启动/停止时执行。 (你不应该知道它:This是了解基本机制的好地方。)

问题 - 据我所知 - 是Hibernate初始化过程没有直接链接到CDI启动。这意味着我不确定依赖Hibernate和Hibernate之间的关系是否安全。 CDI“事件”。当然没有像CDI-Event HibernateInitialized那样的东西。

说完这个,我试试看:)你应该实现一个简单的扩展,它挂在BeforeBeanDiscovery,这是最早的。

This online presentation概述了不同的CDI事件及其顺序。不幸的是,这是德语。