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を使用していません。問題が発生する可能性はありますか?
テストクラスにDirtiesContextアノテーションを付ける必要があります。
@DirtiesContext(methodMode = MethodMode.BEFORE_CLASS)
これにより、テストコンテキストが再構築されるため、スキーマも作成/削除されます。
これについてもっと読む: https://www.baeldung.com/spring-dirtiescontext