DBを組み込んだスプリングブートアプリケーションを実行しようとしています。 Beanの初期化中(何らかの理由で?)私のテーブル作成スクリプトは2回呼び出され、2回目の呼び出しは「テーブルはすでに存在します」というエラーで失敗します。私のコードは以下の通りです。spring embeddeb dbテーブルが既に存在するエラー
@Configuration
public class AppConfig {
private static final Logger LOG = LoggerFactory.getLogger(AppConfig.class);
private static EmbeddedDatabase dataSource;
@Bean
public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
return new DbPlaceholderConfigurer(dataSource());
}
@Bean
public static EmbeddedDatabase dataSource() {
if(dataSource == null) {
EmbeddedDatabaseBuilder databaseBuilder = new EmbeddedDatabaseBuilder();
databaseBuilder.addScript("classpath:schema.sql");
//databaseBuilder.setName("test");
databaseBuilder.setType(EmbeddedDatabaseType.H2);
EmbeddedDatabase build = databaseBuilder.build();
initPopulate(build);
dataSource = build;
}
return dataSource;
}
private static void initPopulate(EmbeddedDatabase embeddedDatabase) {
try {
Connection connection = embeddedDatabase.getConnection();
PreparedStatement prepareStatement;
prepareStatement = connection.prepareStatement("INSERT INTO Settings VALUES (?,?,?)");
prepareStatement.setInt(1, 1);
prepareStatement.setString(2, "testKey");
prepareStatement.setString(3, "testVal");
prepareStatement.executeUpdate();
connection.close();
} catch (SQLException e) {
LOG.error("Error ", e);
}
}
}
エラーログは以下の通りです:
Caused by: org.h2.jdbc.JdbcSQLException: Table "SETTINGS" already exists; SQL statement:
CREATE TABLE Settings(id INT PRIMARY KEY, testKey VARCHAR(100), testValue VARCHAR(100)) [42101-192]
注:私は、次のプロパティを設定することで、正常私のアプリケーションを起動することができますが、私は本当に好奇心、なぜ春は二回、テーブル作成スクリプトを呼び出しています。
spring.datasource.continue-on-error=true
注2:表作成スクリプト(schema.sql)は、以下のようなものです:
create table contacts (
id identity,
firstname varChar(30) not null,
lastName varChar(30) not null,
phoneNumber varChar(20),
emailAddress varChar(50)
);
これは直接的な回答ではありません。あなたは解決策を提示しなかった。私はあなたの答えを編集し、それを完了することをお勧めします。 –
問題は** schema.sql **が** dataSource()**メソッドで** "classpath:schema.sql" **にあると定義されていることです。これは、schema.sqlが2回実行されることを意味します。 – kyleus