【问题标题】:Rolling back a Postgres database using Liquibase in Java在 Java 中使用 Liquibase 回滚 Postgres 数据库
【发布时间】:2021-06-08 08:31:13
【问题描述】:

我正在尝试在组件测试之间回滚对 postgres 表的更改,以便每个测试都有一个干净的数据库可供使用。

我正在使用 liquibase 来设置 postgres(更改日志 xml 来描述设置,然后使用 liquibase-core Kotlin/Java 库来应用它)。我还使用 Hibernate 直接与 postgres 交互。我使用的测试框架是 Kotest,使用 beforeXXX 方法来确保所有设置都在测试运行之前发生。数据库在一切运行之前设置一次,其想法是在每次测试后回滚。

通过查看文档,我发现 tagDatabaserollback 似乎是我需要的,但是在运行它们时,它们似乎并没有真正回滚任何东西。

代码大致如下(这只是测试代码,看看它是否能正常工作,请注意 - 理想情况下,代码会按照我上面的描述进行分段):

// 1 - (Pre-all-tests) Postgres Setup
liquibase = Liquibase(
    "/db/changelog/changelog-master.xml",
    ClassLoaderResourceAccessor(),
    DatabaseFactory.getInstance().findCorrectDatabaseImplementation(JdbcConnection(connection))
)

liquibase.update(Contexts(), LabelExpression())

liquibase.tag("initialised")


// 2 - Something is inserted
val newEntity = ThingEntity()

entityManager.persist(
    entity
)

entityManager.transaction.commit()
entityManager.clear()


// 3 - Cleanup
liquibase.rollback("initialised", Contexts())


// 4 - Fetching
entityManager.find(ThingEntity::class.java, id)

问题是,在运行 liquibase.rollback 之后,我之前坚持的 newEntity 仍然存在。该标签已消失 - 如果我运行 doesTagExist 方法,它会在回滚后返回 true,然后返回 false,因此至少会删除标签。

鉴于我在提交后清除了实体管理器,我不认为这是因为它正在被缓存并且正如我所说的标签正在被删除 - 而不是数据。

谁能告诉我为什么实际交易(即持久化)没有被删除?

谢谢!

【问题讨论】:

    标签: java postgresql hibernate kotlin liquibase


    【解决方案1】:

    您似乎以错误的方式使用 liquibase。您想要拥有的(在单元测试中添加的数据回滚)与此处描述的内容接近:Rollback transaction after @Test 当您要求 liquibase 回滚到某个标签时,它只会为在带有标签的变更集之后应用的变更集执行回滚脚本(如果提供的话):https://docs.liquibase.com/commands/community/rollbackbytag.html

    【讨论】:

      猜你喜欢
      • 2017-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多