将初始数据加载到春季启动中
#java #hibernate #springboot #jpa

我们已经使用Hibernate, Flyway or Liquibase初始化了数据库架构。但是,除了模式外,我们通常需要在运行时期间应用所需的某些数据。这可能是例如一个表Country,其中存储ISO代码和货币。在Spring Boot应用程序中可以使用哪些选项?

使用应用程序设备

我们的Spring Boot应用程序开始后立即执行ApplicationRunner。如果应用程序中有多个ApplicationRunners,则也可以使用@Order按所需顺序进行排序。

@Component
public class CountryLoader implements ApplicationRunner {

    private final CountryRepository countryRepository;

    @Autowired
    public CountryLoader(final CountryRepository countryRepository) {
        this.countryRepository = countryRepository;
    }

    public void run(final ApplicationArguments args) {
        if (countryRepository.count() != 0) {
            return;
        }
        final Country germany = new Country();
        germany.setCode("DE");
        germany.setCurrency("EUR");
        countryRepository.save(germany);
        final Country states = new Country();
        states.setCode("US");
        states.setCurrency("USD");
        countryRepository.save(states);
    }

}

使用ApplicationRunner初始化数据

此选项提供了最高的灵活性,因为该过程可以直接在我们的应用程序中控制

使用data.sql

如果我们正在使用关系数据库,则可以简单地将data.sql放在resources文件夹中。此脚本将由Spring Boot在启动期间针对配置的DataSource自动执行。

INSERT INTO country (code, currency) VALUES ('DE', 'EUR') ON CONFLICT DO NOTHING;
INSERT INTO country (code, currency) VALUES ('US', 'USD') ON CONFLICT DO NOTHING;

postgresql的特殊插入脚本

我们必须确保未多次创建值。如果我们的数据库架构是由Hibernate创建的,我们还应该添加以下属性才能在Hibernate进行更改后运行脚本。

spring:
  jpa:
    defer-datasource-initialization: true

hibernate

运行data.sql

使用变频器

如果我们选择了用于生成模式的飞行或液体,我们还可以使用它们来加载我们的初始数据。他们暗中确保对连接数据库的更改精确执行

在液体的情况下,我们只需在我们的changelogs文件夹中添加另一个带有更高时间戳的更改。

databaseChangeLog:
  - changeSet:
      id: countries-initial
      author: bootify.io
      changes:
        - insert:
            tableName: country
            columns:
            - column:
                name: code
                value: DE
            - column:
                name: currency
                value: EUR
        - insert:
            tableName: country
            columns:
            - column:
                name: code
                value: US
            - column:
                name: currency
                stringValue: USD

- 资源/ChangElogs/2023-01-18_11-00中的liquibase changelog

在Flyway的情况下,我们直接在使用的数据库的方言中创建迁移脚本 。我们将其存储在resources/db/migration/V002__INITIAL_COUNTRIES.sql中,以便在创建表结构之后立即执行。

INSERT INTO country (code, currency) VALUES ('DE', 'EUR');
INSERT INTO country (code, currency) VALUES ('US', 'USD');

_ flyway迁移脚本_

所有三种方法都是有效的选项初始化我们的数据 - 因此,请根据自己的喜好选择。仅应避免使用多种方式并行使用。

» Learn more