我想運行一個嵌入式數據庫的春季啓動應用程序。在bean初始化期間(由於某種原因?)我的表創建腳本被調用兩次,第二次調用失敗,並且「表已存在」錯誤。下面是我的代碼,可能是什麼問題。春天embeddeb數據庫表已存在錯誤
@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將運行兩次。 – kyleus