web-dev-qa-db-ja.com

Spring Boot in memoryデータベースH2は、初期化時にファイルからデータをロードしません

アプリケーションの初期化時にインメモリデータベースにデータをロードする際に問題が発生しました。テーブル構造と初期データを含むschema.sqlおよびdata.sqlファイルを作成しました。

schema.sql:

CREATE TABLE users (
  id          INT PRIMARY KEY,
  username    VARCHAR(64) NOT NULL,
  password    VARCHAR(64) 
);

およびdata.sql

INSERT INTO users (id, username, password) VALUES
  (1, 'usr1', 'bigSecret'),
  (2, 'usr2', 'topSecret');

データレイヤーの操作にJpaRepositoryを使用しています。

public interface UserRepository extends JpaRepository<User, Long> {
}

また、構成しますapplication.properties

spring.datasource.initialize=true
spring.datasource.url=jdbc:h2:mem:testdb;DB_CLOSE_DELAY=- 1;DB_CLOSE_ON_EXIT=FALSE
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=

しかし、私が電話するとき

List<User> users = userRepository.findAll();

ユーザーエンティティ

@Entity
@Table(name = "users")
public class User {

  @Id
  @GeneratedValue
  private Long id;
  private String username;
  private String password;

  public User() {  }

  public Long getId() {
    return id;
  }

  public void setId(Long id) {
    this.id = id;
  }

  public String getUsername() {
    return username;
  }

  public void setUsername(String username) {
    this.username = username;
  }

  public String getPassword() {
    return password;
  }

  public void setPassword(String password) {
    this.password = password;
  }
}

空のリストを取得しますが、メモリ内のH2データベースから2人の事前入力されたユーザーを取得する必要があります。インメモリデータベースの何が問題になっていますか?ありがとう。

6
tyomka

H2の仕様に従って、いつでもこれらのスクリプトの実行を試みることができます。ここで、接続URLにINITスクリプトを追加する必要があります(オプションの1つです)。

jdbc:h2:mem:test;INIT=RUNSCRIPT FROM '~/schema.sql'\;RUNSCRIPT FROM '~/data.sql'"

この機能は、INITプロパティを介して有効になります。複数のコマンドをINITに渡すことができますが、以下の例のように、セミコロン区切り文字をエスケープする必要があることに注意してください。

更新

application.propertiesにこれらのオプションがあることに注意してください。

spring.jpa.generate-ddl=true
spring.jpa.hibernate.ddl-auto=true
spring.datasource.initialize=true

起動時に衝突が発生する可能性があります。したがって、常にどちらか一方を狙う必要がありますが、両方を同時に狙うことはできません。単純なケースでは、これらだけでテーブルを自動構築し、シャットダウンと起動後にリロードするのに十分です

7
Maciej Kowalski