在休眠连接到我的 JBoss AS 7.1 之前,我尝试在我的应用程序中运行 flyway。我尝试使用@javax.ejb.Startup
注释,但这会在初始化 Hibernate 并检查数据库方案后执行。
据我了解,我们可以使用在 Hibernate 初始化之前挂钩的 CDI 扩展。flyway开箱即用是否有一些支持?如果没有,有没有人尝试过这样做?
好的,我终于知道了如何做到这一点:我必须使用 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
CDI 定义了自己的生命周期,在应用程序启动/停止时执行。(你不应该已经知道了吗:这是了解基本机制的好地方。)
问题 - 据我所知 - 是 Hibernate 初始化过程没有直接链接到 CDI 启动。这意味着我不确定依赖 Hibernate 和 CDI“事件”之间的关系是否安全。当然,没有什么比 CDI-Event 更胜一筹了HibernateInitialized
。
话虽如此,我会试一试 :) 您应该实现一个简单的扩展,该扩展连接到BeforeBeanDiscovery
,这是最早的。
此在线演示文稿概述了不同的 CDI 事件及其顺序。不幸的是,它是德语的。