22

在休眠连接到我的 JBoss AS 7.1 之前,我尝试在我的应用程序中运行 flyway。我尝试使用@javax.ejb.Startup注释,但这会在初始化 Hibernate 并检查数据库方案后执行。

据我了解,我们可以使用在 Hibernate 初始化之前挂钩的 CDI 扩展。flyway开箱即用是否有一些支持?如果没有,有没有人尝试过这样做?

4

2 回答 2

38

好的,我终于知道了如何做到这一点:我必须使用 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

于 2012-07-19T09:57:20.977 回答
1

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

问题 - 据我所知 - 是 Hibernate 初始化过程没有直接链接到 CDI 启动。这意味着我不确定依赖 Hibernate 和 CDI“事件”之间的关系是否安全。当然,没有什么比 CDI-Event 更胜一筹了HibernateInitialized

话虽如此,我会试一试 :) 您应该实现一个简单的扩展,该扩展连接到BeforeBeanDiscovery,这是最早的。

此在线演示文稿概述了不同的 CDI 事件及其顺序。不幸的是,它是德语的。

于 2012-06-18T20:17:53.783 回答