Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jpa Spring Boot 2-H2数据库-@SpringBootTest-在org.H2.jdbc.JdbcSQLException上失败:表已存在_Jpa_Spring Boot_Spring Data Jpa_H2 - Fatal编程技术网

Jpa Spring Boot 2-H2数据库-@SpringBootTest-在org.H2.jdbc.JdbcSQLException上失败:表已存在

Jpa Spring Boot 2-H2数据库-@SpringBootTest-在org.H2.jdbc.JdbcSQLException上失败:表已存在,jpa,spring-boot,spring-data-jpa,h2,Jpa,Spring Boot,Spring Data Jpa,H2,无法使用用于使用schema.sql创建表的脚本测试Spring Boot&H2 所以,我设置了以下属性: spring.datasource.driver-class-name=org.h2.Driver spring.datasource.initialization-mode=always spring.datasource.username=sa spring.datasource.password= spring.datasource.platform=h2 spring.dataso

无法使用用于使用schema.sql创建表的脚本测试Spring Boot&H2

所以,我设置了以下属性:

spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.initialization-mode=always
spring.datasource.username=sa
spring.datasource.password=
spring.datasource.platform=h2
spring.datasource.url=jdbc:h2:mem:city;MODE=PostgreSQL;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE

spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
spring.jpa.generate-ddl=false
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
并且,我希望使用schema.sql创建表。当我运行gradle bootRun时,应用程序运行正常。但是,当我使用gradle test运行测试时,我的存储库测试通过,但我的服务测试失败,表明它正在尝试创建表,而表已经存在:

提出的例外情况:

Caused by: org.h2.jdbc.JdbcSQLException: Table "CITY" already exists;             
SQL statement:
CREATE TABLE city ( id BIGINT NOT NULL, country VARCHAR(255) NOT NULL, map VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, state VARCHAR(2555) NOT NULL, PRIMARY KEY (id) ) [42101-196]
at org.h2.message.DbException.getJdbcSQLException(DbException.java:345)
at org.h2.message.DbException.get(DbException.java:179)
at org.h2.message.DbException.get(DbException.java:155)
at org.h2.command.ddl.CreateTable.update(CreateTable.java:117)
at org.h2.command.CommandContainer.update(CommandContainer.java:101)
at org.h2.command.Command.executeUpdate(Command.java:260)
at org.h2.jdbc.JdbcStatement.executeInternal(JdbcStatement.java:192)
at org.h2.jdbc.JdbcStatement.execute(JdbcStatement.java:164)
at com.zaxxer.hikari.pool.ProxyStatement.execute(ProxyStatement.java:95)
at com.zaxxer.hikari.pool.HikariProxyStatement.execute(HikariProxyStatement.java)
at org.springframework.jdbc.datasource.init.ScriptUtils.executeSqlScript(ScriptUtils.java:471)
... 105 more
代码已经设置好,可以重新创建场景了。自述文件包含所有信息->

如果单独运行测试,则测试通过。我认为问题是由于对同一数据库执行了两次schema.sql。第二次失败,因为表已经存在

作为一种解决方法,您可以在
application.properties
中设置
spring.datasource.continue on error=true


另一个选项是在适当的情况下添加
@AutoConfigureTestDatabase
注释,以便为每个测试使用唯一的嵌入式数据库。

您可以尝试以下两种其他可能的解决方案:

  • 创建表之前,在schema.sql中添加
    删除表(如果存在)[tablename]
  • 将语句从
    CREATE TABLE
    更改为
    CREATE TABLE(如果不存在)

  • 使用@AutoConfigureTestDatabase解决了这个问题。感谢您抽出时间。同样,使用@AutoConfigureTestDatabase解决了这个问题。我为此苦苦挣扎了3个小时,谢谢你,这两处房产也解决了我的问题。但是,为什么要在同一个应用程序上下文中执行两次SQLs呢?您的解决方案对我来说效果最好,因为它还解决了之后出现的问题,即数据插入导致唯一键冲突的问题。谢谢。对于数据插入,我使用了唯一的密钥冲突