Java 如何在hibernate验证之前启动flyway迁移?

Java 如何在hibernate验证之前启动flyway迁移?,java,spring,hibernate,flyway,Java,Spring,Hibernate,Flyway,我使用flyway+hibernate验证。我有flyway bean: @Component public class DbMigration { private static final Logger LOG = LoggerFactory.getLogger(DbMigration.class); private final Config config; @Autowired public DbMigration(Config config) {

我使用flyway+hibernate验证。我有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
    }
}
在应用类中,我会这样做:

public static void main(String[] args) {
        try {
            AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ApplicationConfiguration.class);
            context.getBean(DbMigration.class).runMigration();
但是我的hibernate在
runMigration()之前启动并验证抛出验证。我下一步怎么开始

  • 运行迁移
  • 启动休眠验证
  • 编辑:


    但是我认为在spring应用程序配置中它是不好的,如果您有实体管理器工厂bean配置,您可以使它依赖于Flywaybean,以便在它之后初始化它。比如:

    @Bean
    @DependsOn("flyway")
    public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
        // Initialize EntityManagerFactory here
    }
    
    flyway
    bean配置可以是:

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

    是的,我有LocalContainerEntityManagerFactoryBean,在那里我得到了“flyway”?“flyway”是你的flyway bean的名字。您可以像配置
    LocalContainerEntityManagerFactoryBean一样配置它。我将在我的答案中添加一个示例。如果您只在
    Flyway
    实例上使用,这是一个很好的解决方案。在我的项目中,每个模块都有自己的
    Flyway
    实例来管理自己的表,现在也有同样的问题。在这种情况下,如何解决初始化问题?您是否使用
    spring boot
    ?如果是这样,则不需要为flyway移植定义组件。如果您想覆盖默认选项并使其在hibernate之前运行,请添加一个bean配置,就像我在回答中解释的那样。您不需要告诉spring boot运行迁移,它会自动完成迁移。
    @Bean(initMethod = "migrate")
    public Flyway flyway() {
        Flyway flyway = new Flyway();
        // configure bean here
        return flyway;
    }