2015-03-25 3 views
11

Я пытаюсь интегрировать Flyway для миграции в проекте Spring Boot с Hibernate и Spring JPA. Я получаю следующее исключение:Интеграция Flyway и Spring Boot

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. 

Мой pom.xml смотрит как это:

<dependency> 
    <groupId>org.flywaydb</groupId> 
    <artifactId>flyway-core</artifactId> 
    <version>3.2</version> 
</dependency> 

Я использую Hibernate и конфигурационный файл Java для Postgres (этап Dev) и 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() { 
... 

Я не могу найти ничего о своей проблеме, описанной в этом вопросе. Может ли кто-нибудь помочь?

+2

Spring Boot уже поддерживает пролет, единственное, что вам нужно, это добавить пролет в качестве зависимости ... Я предлагаю прочитать [manual] (http://docs.spring.io/spring-boot/docs/current/ reference/html/howto-database-initialization.html # howto-execute-flyway-database-migrations-on-startup) и для [свойств конфигурации] (http://docs.spring.io/spring-boot/docs/ ток/ссылка/HTML/общее приложение properties.html). Для меня это похоже на то, что вы используете загрузку и очень стараетесь работать с ней (явно настраивая все, например). –

+0

довольно странно: весенний ботинок не должен начинаться с автоконфигурации пролетного пути, если вы настроите пролет для себя (вопрос, если это необходимо). однако ошибка возникает из-за автоконфигурации загрузки. однако попробуйте добавить 'flyway.initOnMigrate = true' к вашим приложениям.properties и удалить свою собственную инициализацию flyway :) – sodik

+0

thx для хитов. – imalik8088

ответ

36

Spring-Boot способен на это самостоятельно. Просто добавьте пролет в зависимости от вашего проекта, и весенняя сапога поднимет его. Перенос пропусков начнется, когда начнется сервис.

Если у вас уже есть несколько таблиц в базе данных оный:

flyway.baseline-on-migrate=true 

в файл свойств, чтобы сохранить спокойствие Пролетного пути, когда он обнаруживает, что некоторые таблицы уже существует. ;-)

Flyway должен забрать ваш источник данных. Если вам нужно, например, другой пользователь или что-то подобное для пролета, вы можете установить эти свойства:

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

(! Конечно добавить свои значения Вы можете использовать SPEL ссылаться на другие свойствах)

Update

Одно предупреждение. Если вы используете кластерную базу данных, вы можете столкнуться с проблемами, которые одновременно запускают несколько экземпляров, которые одновременно запускают обновления. Это проблема, когда блокировки таблицы не работают, что произошло со мной, используя кластерный mariaDB.

+6

Использовать 'flyway.baseline-on-migrate = true' вместо этого. 'flyway.initOnMigrate' устарел. –

+0

Спасибо, я обновил ответ! –

+2

этот ответ действительно должен быть отмечен как принятый ответ – mainframer

Смежные вопросы