gpt4 book ai didi

spring-boot - Spring Embeddeb数据库表已存在错误

转载 作者:行者123 更新时间:2023-12-03 14:12:06 24 4
gpt4 key购买 nike

我正在尝试运行带有嵌入式数据库的Spring Boot应用程序。在bean初始化期间(由于某种原因?),我的表创建脚本被调用了两次,并且第二次调用因“表已存在”错误而失败。下面是我的代码,可能是什么问题。

@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为什么两次调用表创建脚本。
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)
);

最佳答案

我发现当我将H2 schema.sql data.sql 文件放在 src/main/resources 目录中,并且在 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加载相同的数据。

要消除该错误,请从 dataSource()中删除 schema.sql data.sql
@Bean
public DataSource embeddedDataSource() {
return new EmbeddedDatabaseBuilder()
.setType(EmbeddedDatabaseType.H2).build();
}

关于spring-boot - Spring Embeddeb数据库表已存在错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38720791/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com