user5620472
user5620472

Reputation: 2882

How can I start flyway migration before hibernate validation?

I use flyway + hibernate validate. I have flyway bean:

@Component
public class DbMigration {

    private static final Logger LOG = LoggerFactory.getLogger(DbMigration.class);

    private final Config config;

    @Autowired
    public DbMigration(Config config) {
        this.config = config;
    }

    public void runMigration() {
        try {
            Flyway flyway = new Flyway();
            flyway.configure(properties());
            int migrationApplied = flyway.migrate();
            LOG.info("[" + migrationApplied + "] migrations are applied");
        } catch (FlywayException ex) {
            throw new DatabaseException("Exception during database migrations: ", ex);
        }
    }

    public Properties properties() {
        //my prop
    }
}

And in Apllication class I do it:

public static void main(String[] args) {
        try {
            AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ApplicationConfiguration.class);
            context.getBean(DbMigration.class).runMigration();

But my hibernate start before runMigration(); And validate throw exeption. How can I start next?

  1. run Migration
  2. start hibernate validation

EDIT:

  @Bean
    @Autowired
    public LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource datasource) {
        log.info("entityManagerFactory start");
        dbMigration.runMigration();

But I think it is bad

Upvotes: 2

Views: 2377

Answers (1)

Mustafa
Mustafa

Reputation: 6154

In your spring application configuration, if you have an entity manager factory bean configuration you can make it depend on the flyway bean so that it gets initialized after it. Something like:

@Bean
@DependsOn("flyway")
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
    // Initialize EntityManagerFactory here
}

The flyway bean configuration can be something like:

@Bean(initMethod = "migrate")
public Flyway flyway() {
    Flyway flyway = new Flyway();
    // configure bean here
    return flyway;
}

Upvotes: 3

Related Questions