web-dev-qa-db-ja.com

Spring Boot 2-H2データベース[email protected]で失敗:テーブルはすでに存在します

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

コードがセットアップされ、シナリオを再作成する準備ができました。 READMEすべての情報があります-> https://github.com/tekpartner/learn-spring-boot-data-jpa-h2

9
Tora Tora Tora

テストが個別に実行された場合、テストは合格です。問題は、同じデータベースに対してschema.sqlが2回実行されているためだと思います。テーブルが既に存在するため、2回目に失敗します。

回避策として、spring.datasource.continue-on-error=trueapplication.propertiesを設定できます。

別のオプションは、適切な場所に@AutoConfigureTestDatabase注釈を追加して、各テストで一意の埋め込みデータベースが使用されるようにすることです。

4
Madhura Bhave

あなたが試すことができる他の2つの可能な解決策があります:

  1. テーブルを作成する前に、schema.sqlにdrop table if exists [tablename]を追加します。
  2. ステートメントをCREATE TABLEからCREATE TABLE IF NOT EXISTSに変更します
3
the hand of NOD