アプリケーションの初期化時にインメモリデータベースにデータをロードする際に問題が発生しました。テーブル構造と初期データを含む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人の事前入力されたユーザーを取得する必要があります。インメモリデータベースの何が問題になっていますか?ありがとう。
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
起動時に衝突が発生する可能性があります。したがって、常にどちらか一方を狙う必要がありますが、両方を同時に狙うことはできません。単純なケースでは、これらだけでテーブルを自動構築し、シャットダウンと起動後にリロードするのに十分です