代码之家  ›  专栏  ›  技术社区  ›  Tora Tora Tora

Spring Boot 2-H2数据库-@SpringBootTest-在组织上失败。h2.jdbc。JdbcSQLException:表已存在

  •  15
  • Tora Tora Tora  · 技术社区  · 7 年前

    无法测试弹簧防尘套(&T);H2,带有使用模式创建表的脚本。sql。

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

    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
    

    并且,我希望使用该模式创建表。sql。运行时,应用程序工作正常 gradle引导运行 . 但是,当我使用 gradle试验 ,我的存储库测试通过,但我的服务测试失败,表明它试图在表已存在时创建表:

    引发的异常:

    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
    

    代码已设置完毕,可以重新创建场景。自述文件包含所有信息-> https://github.com/tekpartner/learn-spring-boot-data-jpa-h2

    2 回复  |  直到 7 年前
        1
  •  19
  •   Madhura Bhave    7 年前

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

    作为解决方法,您可以设置 spring.datasource.continue-on-error=true 在里面 application.properties .

    另一个选项是添加 @AutoConfigureTestDatabase 注释,以便在每次测试中使用唯一的嵌入式数据库。

        2
  •  17
  •   the hand of NOD    6 年前

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

    1. 添加一个 drop table if exists [tablename] 在您的架构中。创建表之前使用sql。
    2. 将语句更改为 CREATE TABLE CREATE TABLE IF NOT EXISTS