Spring Boot - 初期データの読み込み 質問する

Spring Boot - 初期データの読み込み 質問する

アプリケーションを起動する前に初期データベース データをロードする最適な方法は何でしょうか? 私が探しているのは、H2 データベースにデータを入力する方法です。

たとえば、ドメイン モデル「User」があり、/users に移動してユーザーにアクセスできますが、最初はデータベースにユーザーが存在しないため、ユーザーを作成する必要があります。データベースにデータを自動的に入力する方法はありますか?

現時点では、コンテナによってインスタンス化され、ユーザーを作成する Bean があります。

例:

@Component
public class DataLoader {

    private UserRepository userRepository;

    @Autowired
    public DataLoader(UserRepository userRepository) {
        this.userRepository = userRepository;
        LoadUsers();
    }

    private void LoadUsers() {
        userRepository.save(new User("lala", "lala", "lala"));
    }
}

しかし、それが最善の方法であるかどうかは大いに疑問です。それとも、そうでしょうか?

ベストアンサー1

src/main/resourcesフォルダにdata.sqlファイルを作成すると、起動時に自動的に実行されます。このファイルには、次のような挿入ステートメントを追加できます。

INSERT INTO users (username, firstname, lastname) VALUES
  ('lala', 'lala', 'lala'),
  ('lolo', 'lolo', 'lolo');

同様に、 schema.sqlファイル (または schema-h2.sql) を作成してスキーマを作成することもできます。

CREATE TABLE task (
  id          INTEGER PRIMARY KEY,
  description VARCHAR(64) NOT NULL,
  completed   BIT NOT NULL);

ただし、通常はこれを行う必要はありません。Spring Boot は既に Hibernate を設定して、メモリ内データベースのエンティティに基づいてスキーマを作成するためです。schema.sql を本当に使用したい場合は、これを application.properties に追加してこの機能を無効にする必要があります。

spring.jpa.hibernate.ddl-auto=none

詳細については、以下のドキュメントをご覧ください。データベースの初期化


Spring Boot 2を使用している場合、データベースの初期化は組み込みデータベース (H2、HSQLDB など) に対してのみ機能します。他のデータベースでも使用したい場合は、初期化モード プロパティを変更する必要があります。

spring.sql.init.mode=always # Spring Boot >=v2.5.0
spring.datasource.initialization-mode=always # Spring Boot <v2.5.0

複数のデータベース ベンダーを使用している場合は、使用するデータベース プラットフォームに応じて、ファイルにdata-h2.sqlまたはdata-mysql.sql という名前を付けることができます。

これを機能させるには、データソース プラットフォーム プロパティを構成する必要があります。

spring.sql.init.platform=h2 # Spring Boot >=v2.5.0
spring.datasource.platform=h2 # Spring Boot <v2.5.0

おすすめ記事