我试图在我的应用程序中运行flyway,然后hibernate挂钩我的JBoss AS 7.1。我尝试使用@javax.ejb.Startup
注释,但是在初始化Hibernate并检查数据库方案后执行此操作。
据我所知,我们可以使用在初始化Hibernate之前挂钩的CDI扩展。对飞路的开箱即用有什么支持吗?如果没有,有没有人试过这样做呢?
答案 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事件及其顺序。不幸的是,这是德语。