我遇到了与这个用户类似的问题。Hibernate不能在每次SpringBootTest之后(例如运行mvn test时)删除我的内存测试数据库表格。希望的行为是
我认为原因可能是
我的data.sql脚本仅包含
有没有办法在不必指定模式创建的情况下指定删除语句的顺序?或者有人知道最初的问题的解决方法?
编辑:
我想给出一个例子。我有一个
ddl-auto=create-drop
,但这不起作用。我认为原因可能是
DROP TABLE
语句的顺序无效,因此Hibernate尝试删除其他表格仍依赖的表格。我的data.sql脚本仅包含
INSERT
语句,并且基于我的实体自动创建模式。我尝试将DROP TABLE
语句添加到data.sql的顶部,它们都通过了(ddl-auto=create
),因为我可以指定它们必须被删除的顺序。另一方面,我现在也必须在data.sql中指定模式创建。有没有办法在不必指定模式创建的情况下指定删除语句的顺序?或者有人知道最初的问题的解决方法?
编辑:
我想给出一个例子。我有一个
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,这可能会导致问题吗?
CascadeType
规范吗? - Melkor