アプリケーションを起動する前に初期データベース データをロードする最適な方法は何でしょうか? 私が探しているのは、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