Przedłużacz CDI do Flyway

Próbowałem uruchomić flyway w mojej aplikacji, zanim hibernate podłączy się do mojego Jbossa jako 7.1. Próbowałem z adnotacją @javax.ejb.Startup, ale to jest wykonywane po zainicjowaniu Hibernate i sprawdzeniu schematu bazy danych.

O ile dobrze rozumiem, możemy użyć rozszerzenia CDI, które hookuje przed zainicjowaniem Hibernate. Czy jest jakieś wsparcie dla tego z pudełka na flyway? A jeśli nie, czy ktoś próbował to zrobić wcześniej?

Author: Dominik Obermaier, 2012-06-17

2 answers

Ok w końcu dowiedziałem się jak to zrobić: musiałem użyć API integracji Hibernate. To jest cały kod, który musiałem napisać:

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
  }
}

Jeśli ktoś jest zainteresowany więcej szczegółów, stworzyłem projekt github, który pokazuje, że: https://github.com/dobermai/Hibernate-Flyway-Integration

 33
Author: Dominik Obermaier,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-27 21:43:10

CDI definiuje swój własny cykl życia, który jest wykonywany podczas uruchamiania / zatrzymywania aplikacji. (Nie powinieneś już o tym wiedzieć: to {[4] } jest dobrym miejscem, aby dowiedzieć się o podstawowym mechanizmie.)

Problem - według mojej najlepszej wiedzy-polega na tym, że proces inicjalizacji Hibernate nie jest bezpośrednio powiązany z uruchomieniem CDI. Oznacza to, że nie jestem pewien, czy bezpiecznie jest polegać na relacji między "zdarzeniami" Hibernate & CDI. Nie ma to jak CDI-Event HibernateInitialized.

Powiedziawszy to, spróbowałbym:) powinieneś zaimplementować proste rozszerzenie, które hokuje się w BeforeBeanDiscovery, czyli tak wcześnie, jak się da.

Ta prezentacja online zawiera przegląd różnych wydarzeń CDI i ich kolejności. Jest po niemiecku, niestety.

 1
Author: jan groth,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-19 04:09:43