web-dev-qa-db-ja.com

Hibernate H2がドロップテーブルの順序を指定する

this user のようなほぼ同じ問題があります。 Hibernateは、SpringBootTest(mvn testの実行時など)のたびに、インメモリテストデータベースのテーブルを削除できません。望ましい動作はddl-auto=create-drop、これは機能しません。

その理由は、DROP TABLEステートメント。これにより、Hibernateは他のテーブルがまだ依存しているテーブルを削除しようとします。

私のdata.sqlスクリプトにはINSERTステートメントのみが含まれており、スキーマはエンティティに基づいて自動的に作成されます。追加してみましたDROP TABLEステートメントをdata.sqlの先頭に追加すると、それらはすべて(ddl-auto=create)、ドロップする順序を指定できるため。一方、data.sqlでもスキーマの作成を指定する必要があります。

スキーマの作成を指定せずに、dropステートメントの順序を指定する方法はありますか?または、誰かが 初期問題 の解決策を知っていますか?

編集:

例を挙げたいと思います。他のエンティティとの関係を持つUserエンティティがあります(M:N、1:N、1:1)。スキーマが作成されると、Hibernateはすべてのテーブルを削除して作成し、制約を追加します。

// first test file:
Hibernate: drop table user if exists
... // drop other tables
Hibernate: create table user (username varchar(255) not null, ... , primary key (username))
... // create other tables
Hibernate: alter table X add constraint FKgi38hy0tsrdm332gdjrc0uhm3 foreign key (username) references user
Hibernate: alter table Y add constraint FK5svpy1b71l4jxni0xylrbbdtv foreign key (username) references user
Hibernate: alter table Z add constraint FK5a8fxbb0ug3eo1lisdrrxbbj foreign key (username) references user

// next test file:
Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Cannot drop "USER" because "FKGI38HY0TSRDM332GDJRC0UHM3, FK5SVPY1B71L4JXNI0XYLRBBDTV, FK5A8FXBB0UG3EO1LISDRRXBBJ" depends on it; SQL statement:
drop table user if exists [90107-200]

このプロセスは、制約に違反しているため、最初のテストファイルの後は機能しません。これがドロップ順を指定したかった理由です。

エンティティでCascadeTypeを使用していません。問題が発生する可能性はありますか?

3
Melkor

テストクラスにDirtiesContextアノテーションを付ける必要があります。

@DirtiesContext(methodMode = MethodMode.BEFORE_CLASS)

これにより、テストコンテキストが再構築されるため、スキーマも作成/削除されます。

これについてもっと読む: https://www.baeldung.com/spring-dirtiescontext

0