Extensión CDI para Flyway
ejb-3.1 (2)
CDI define su propio ciclo de vida que se ejecuta cuando una aplicación se inicia / detiene. (¿No deberías saberlo ya? This es un buen lugar para aprender sobre el mecanismo básico).
El problema, que yo sepa, es que el proceso de inicialización de Hibernate no está directamente vinculado al inicio del CDI. Esto significa que no estoy seguro de si es seguro confiar en una relación entre los "eventos" de Hibernate y CDI. Ciertamente no hay nada como un CDI-Event HibernateInitialized
.
Habiendo dicho esto, lo intentaría :) Debería implementar una extensión simple que se BeforeBeanDiscovery
a BeforeBeanDiscovery
, que es tan pronto como sea posible.
Esta presentación en línea ofrece una descripción general de los diferentes eventos de CDI y su orden. Está en alemán, por desgracia.
Intenté ejecutar la ruta migratoria en mi aplicación antes de que la hibernación se conectara a mi JBoss AS 7.1. Probé con una anotación de @javax.ejb.Startup
, pero esto se ejecuta DESPUÉS DE QUE Hibernate se inicialice y se verifique el esquema de la base de datos.
Por lo que entiendo, podemos usar una extensión CDI que se engancha antes de que se inicie Hibernate. ¿Hay algún apoyo para eso fuera de la caja para la ruta migratoria? Y si no, ¿alguien ha intentado hacer esto antes?
Ok, finalmente descubrí cómo hacerlo: tuve que usar la API de integración de Hibernate. Este es todo el código que tuve que escribir:
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
}
}
Si alguien está interesado en obtener más detalles, creé un proyecto github que demuestra que: https://github.com/dobermai/Hibernate-Flyway-Integration