使用 Hibernate 和 Spring Boot 截断所有数据库表

Truncate all database tables with Hibernate and Spring Boot

我需要在每次测试后截断所有数据库 table。有没有办法这样做,或者至少有一种与数据库无关的方法来获取所有 table 名称,以便可以截断它们。

欢迎任何其他选择。但请记住 @Transactional@Rollback 不会有帮助,因为我正在处理在服务器上触发 http 请求的集成测试。

我从一个文本文件中读取了这个 属性 并在每次执行我的项目时重建数据库的 if 语句中添加了 2 个休眠属性,也许这可以帮助你?

if (environment.getProperty("dbReset").compareTo("ON") == 0)
{
    properties.put("hbm2ddl.auto", "create");
    properties.put("hibernate.hbm2ddl.auto", "create");
}

我认为您将难以以一种简单的、与数据库无关的方式截断表。例如,您如何处理外键约束?一些数据库会让您以正确的顺序截断表,让您面临如何定义该顺序的问题。但是如果我没记错的话,有些根本不允许你截断带有外键约束的表,即使是空的。然后您需要使用一些特定于数据库的 DDL 来禁用约束,或者更糟的是,删除并重新创建它们。

如果您采用这种方法,您也排除了并行集成测试的可能性。

我一直发现一个更好的方法是让每个测试只清除它创建的数据。例如,对于你的 create API,你可以注册一个监听器来记录你测试代码中所有创建的实体的 ID,然后在拆卸时你可以反向迭代这个 ID 列表,打电话给你的 delete API。这种方法的缺点是您可能需要实现您的应用程序实际上并不需要的 APIs,只是为了支持测试。然而,这些可以在部署到生产时被一个标志禁用。