Весенний ботинок. Запуск журнала изменений Liquibase после создания таблиц jpa auto-dll на hsqldb

Дело такое. У меня есть список изменений Liquibase, содержащий только вставки. Я пытаюсь заставить Spring Boot инициализировать схему базы данных (hsqldb) с помощью JPA на основе @Entities, а затем выполнить журнал изменений Liquibase. К сожалению, Spring Boot делает это в обратном порядке.

Я проверил LiquibaseAutoConfiguration, и в нем есть:

@AutoConfigureAfter({ DataSourceAutoConfiguration.class,
        HibernateJpaAutoConfiguration.class })

поэтому он выполняется после HibernateJpaAutoConfiguration, однако Spring Boot по-прежнему делает это не так, как я хочу;).

Версия Spring Boot: 1.3.0.RELEASE Версия ядра Liquibase: 3.5.1

Заранее спасибо за любой насвер


person Tomasz Sokol    schedule 07.07.2016    source источник


Ответы (2)


Возможное решение - отключить автоматический запуск загрузочной ликибазы через application.properties:

spring.jpa.hibernate.ddl-auto=create
liquibase.enabled=false

а затем вручную настроить SpringLiquibase bean в зависимости от entityManagerFactory:

import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder;
import org.springframework.boot.autoconfigure.liquibase.LiquibaseProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.DependsOn;

import liquibase.integration.spring.SpringLiquibase;

@SpringBootApplication
public class DemoApplication {

    @Autowired
    private DataSource dataSource;

    @Bean
    public LiquibaseProperties liquibaseProperties() {
        return new LiquibaseProperties();
    }

    @Bean
    @DependsOn(value = "entityManagerFactory")
    public SpringLiquibase liquibase() {
        LiquibaseProperties liquibaseProperties = liquibaseProperties();
        SpringLiquibase liquibase = new SpringLiquibase();
        liquibase.setChangeLog(liquibaseProperties.getChangeLog());
        liquibase.setContexts(liquibaseProperties.getContexts());
        liquibase.setDataSource(getDataSource(liquibaseProperties));
        liquibase.setDefaultSchema(liquibaseProperties.getDefaultSchema());
        liquibase.setDropFirst(liquibaseProperties.isDropFirst());
        liquibase.setShouldRun(true);
        liquibase.setLabels(liquibaseProperties.getLabels());
        liquibase.setChangeLogParameters(liquibaseProperties.getParameters());
        return liquibase;
    }

    private DataSource getDataSource(LiquibaseProperties liquibaseProperties) {
        if (liquibaseProperties.getUrl() == null) {
            return this.dataSource;
        }
        return DataSourceBuilder.create().url(liquibaseProperties.getUrl())
            .username(liquibaseProperties.getUser())
            .password(liquibaseProperties.getPassword()).build();
    }

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

Однако я настоятельно рекомендую использовать Liquibase и для построения схемы. Я считаю, что он был разработан (см. org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration.LiquibaseJpaDependencyConfiguration) для запуска до ddl-auto спящего режима, чтобы можно было установить ddl-auto=validate и проверить схему ликвибазы с помощью спящего режима.

person Radek Postołowicz    schedule 07.07.2016
comment
Мой случай с точностью до наоборот. stackoverflow.com/ questions / 58918808 / - person Mansoor; 18.11.2019

Решение, предоставленное Радеком Постоловичем, служило мне довольно долгое время, но больше не работало после обновления до spring -boot 2.5.0. Думаю, его можно полностью заменить, добавив в application.properties (или yml) следующее свойство:

spring.jpa.defer-datasource-initialization=true

Это также упоминается в примечания к выпуску.

person Felix    schedule 15.06.2021