برنامه نویسی

بارگیری داده های اولیه در Spring Boot

ما قبلاً طرح پایگاه داده را با استفاده از Hibernate، Flyway یا Liquibase مقداردهی اولیه کرده ایم. با این حال، علاوه بر طرحواره، ما اغلب به داده های خاصی نیاز دارند که در طول زمان اجرا برای برنامه ضروری است. این می تواند به عنوان مثال یک میز باشد Country، که کد ISO و یک ارز در آن ذخیره می شود. چه گزینه هایی برای این کار در برنامه Spring Boot موجود است؟

با استفاده از ApplicationRunner

یک ApplicationRunner بلافاصله پس از شروع برنامه Spring Boot ما اجرا می شود. اگر چندتایی باشد 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

اگر ما با یک پایگاه داده رابطه ای کار می کنیم، می توانیم به سادگی a را قرار دهیم 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
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

اجرای data.sql بعد از Hibernate

استفاده از تغییرات ثبت شده

اگر Flyway یا Liquibase را برای تولید طرحواره انتخاب کرده‌ایم، می‌توانیم از آنها برای بارگذاری داده‌های اولیه خود نیز استفاده کنیم. آنها به طور ضمنی اطمینان حاصل کنید که تغییرات دقیقا یک بار اجرا می شوند در برابر پایگاه داده متصل

در مورد Liquibase ما به سادگی تغییرات دیگری را با مهر زمانی بالاتر به ما اضافه می کنیم 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
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

تغییرات Liquibase در منابع/changelogs/2023-01-18_11-00.yml

در مورد 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 _

هر سه راه گزینه های معتبری هستند برای مقداردهی اولیه داده های ما – بنابراین با توجه به اولویت خود انتخاب کنید. فقط باید از استفاده موازی از راه های متعدد اجتناب شود.

” بیشتر بدانید

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

همچنین ببینید
بستن
دکمه بازگشت به بالا