当前位置: 首页 > 知识库问答 >
问题:

Flyway和Spring靴集成

栾烨华
2023-03-14

我试图在Spring Boot项目中与Hibernate和Spring JPA集成Flyway for Migration。我遇到以下异常:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'flyway' defined in class path resource [org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]: Invocation of init method failed; nested exception is org.flywaydb.core.api.FlywayException: Found non-empty schema "PUBLIC" without metadata table! Use init() or set initOnMigrate to true to initialize the metadata table.
<dependency>
  <groupId>org.flywaydb</groupId>
  <artifactId>flyway-core</artifactId>
  <version>3.2</version>
</dependency>

我正在使用Hibernate和一个配置java文件,用于postgres(开发阶段)和h2(本地)。签名是这样的:

  @Bean(initMethod = "migrate")
  public Flyway flyway() {
    Flyway fly = new Flyway();
    fly.clean();
    fly.init();
    //flyway.setInitOnMigrate(true);
    fly.setSchemas("SBA_DIALOG");
    //flyway.setLocations("filesystem:src/main/resources/db/migration");
    fly.setDataSource(this.dataSource());
    fly.migrate();
    return fly;
  }
@Bean(name = "sbaEntityManagerFactory") @DependsOn("flyway")
  public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
...

我找不到关于我在这个问题中描述的问题的任何东西。有人能帮忙吗?

共有1个答案

谢鸿羲
2023-03-14

Spring-Boot能够自己做到这一点。只需将flyway作为依赖项添加到您的项目中,spring-boot就会拾取它。Flyway迁移将在服务启动时启动。

如果数据库中已经有一些表,则添加:

spring.flyway.baselineOnMigrate = true 

以使flyway在发现某些表已经存在时保持平静。;-)

spring.flyway.url: jdbc:postgresql://${db.host}/${db.name}
spring.flyway.user: MYUSER
spring.flyway.password: MYPWD

更新

一个警告:如果使用集群数据库,您可能会遇到同时启动的多个实例试图同时执行更新的问题。这是表锁不工作时的问题,我使用集群的MariaDB时就发生过这种情况。

 类似资料:
  • 我想做一些spring boot应用程序。我已经创建了spring boot项目,但我有一个问题。我的控制器看起来像: 但我看到的并不是索引。html,但只有一个单词“index”。所以我想用角度。 和控制器: 我的索引。html 但它不起作用,我只在本地主机上看到错误。 如何使这个角度控制器正常工作并返回正确的视图?

  • 我使用Spring引导1.3.3和黑兹尔卡斯特我的构建看起来像: 当服务在Linux执行时,我在日志中看到: 但我在油罐里看到hazelcast-all.jar有线索吗?

  • 我该如何解决这个问题?

  • 我想得到帮助,使我的spring boot应用程序更安全。 我有一个RESTful API,目前没有实现安全性。另一个spring boot应用程序通过HTTP请求(GET、POST、PUT…)访问该API。 最近,我学习了一个REDHAT教程,该教程演示了如何使用keycloak制作一个更安全的Spring启动应用程序。 我想学习如何使用这个安全组合(springsecurity-keycloa

  • 我正在用Thymeleaf构建一个Spring Boot应用程序。我的模板(视图)和静态文件夹都在src/main/Resources/静态和src/main/Resources/tem板下。当我通过main方法(使用eclipse)运行应用程序时,一切都很好。但是,我已经按照说明创建了一个war文件,当我将其部署到Tomcat 7时——静态内容丢失了,只显示了Thymeleaf html模板。

  • 我有一个在8888端口上运行的Spring Boot后端应用程序和一个在4200端口上运行的Angular前端应用程序。 在我的Spring Boot应用程序中,我定义了以下bean来处理CORS: 我的配置如下所示: 通过这种配置,一切正常,我可以从Angular应用程序成功调用我的API。 但我想启用CSRF,所以我将安全配置更改为: 我在Angular应用程序中添加了以下: 问题是始终返回。