gpt4 book ai didi

jpa - Spring Boot 。在 hsqldb 上生成 jpa 自动 dll 表后运行 liquibase 更改日志

转载 作者:行者123 更新时间:2023-12-03 23:43:42 26 4
gpt4 key购买 nike

案例是这样的。
我的 liquibase 更改日志仅包含插入内容。
我试图强制 Spring Boot 使用基于 @Entities 的 JPA 初始化数据库(hsqldb)模式,然后执行 liquibase 更改日志。不幸的是,Spring Boot 是以相反的顺序进行的。

我检查了 LiquibaseAutoConfiguration,它有:

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

所以它是在 HibernateJpaAutoConfiguration 之后执行的,但是 Spring Boot 仍然不是我希望的方式 ;)。

Spring Boot 版本:1.3.0.RELEASE
Liquibase 核心版本:3.5.1

预先感谢您的任何回答

最佳答案

可能的解决方案是通过 application.properties 禁用自动启动 liquibase 运行:

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并通过 hibernate 验证 liquibase 模式。

关于jpa - Spring Boot 。在 hsqldb 上生成 jpa 自动 dll 表后运行 liquibase 更改日志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38240366/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com