2016-08-02 28 views
3

我想運行一個嵌入式數據庫的春季啓動應用程序。在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) 
); 

回答

0

,可隨時更換你的數據庫的初始化代碼。 Spring Boot開箱即用。 以下屬性應該給你一個想法:

spring.datasource.initialize=true # Populate the database using 'data.sql'. 
spring.datasource.separator=; # Statement separator in SQL initialization scripts. 
spring.datasource.sql-script-encoding= # SQL scripts encoding. 

看到Spring Bootdocumentation的其他屬性。

4

我發現,當我有我的H2 schema.sql文件在我的src/main /資源data.sql文件目錄並以我DatabaseConfig引用這是發生:

@Bean 
public DataSource embeddedDataSource() { 
    return new EmbeddedDatabaseBuilder() 
     .setType(EmbeddedDatabaseType.H2) 
     .addScript("classpath:schema.sql") 
     .addScript("classpath:data.sql") 
     .build(); 
} 

我正在初始化我的DatabaseConfig類中的內存數據庫,然後Spring Boot試圖加載基於its configuration rules的相同數據。

爲了擺脫錯誤的從數據源()刪除schema.sql文件data.sql

@Bean 
public DataSource embeddedDataSource() { 
    return new EmbeddedDatabaseBuilder() 
     .setType(EmbeddedDatabaseType.H2).build(); 
} 
+0

請注意,這不是一個直接的答案。你沒有給出解決方案。我建議你編輯你的答案並完成它。 –

+1

問題是,** schema.sql **在** dataSource()**方法中定義爲**「classpath:schema.sql」**中。這意味着schema.sql將運行兩次。 – kyleus