一尘不染

Hibernate H2指定删除表的顺序

spring-boot

我和这个用户几乎有同样的问题。在每个SpringBootTest之后,Hibernate不能删除我的内存中测试数据库的表(例如,运行mvn测试时)。所需的行为是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,这可能引起问题吗?


阅读 342

收藏
2020-05-30

共1个答案

一尘不染

我终于找到了解决我的问题的方法。就像我说的那样,错误是由于尝试删除仍依赖于其他表的表而引起的。我以为这可能与缺少CascadeType规范有关,但我无法解决。

然后我找到了这个答案,它对我有用。除了data.sql文件(所有数据都插入到自动创建的架构中)之外,我现在还有一个drop- tables.sql可以指定正确DROP语句顺序的地方。该文件在自动创建模式之前执行,因此解决了我的问题。

application.properties:

spring.jpa.properties.javax.persistence.schema-generation.database.action=drop-and-create
spring.jpa.properties.javax.persistence.schema-generation.drop-source=script-then-metadata
spring.jpa.properties.javax.persistence.schema-generation.drop-script-source=drop-tables.sql
2020-05-30