【发布时间】:2021-06-08 08:31:13
【问题描述】:
我正在尝试在组件测试之间回滚对 postgres 表的更改,以便每个测试都有一个干净的数据库可供使用。
我正在使用 liquibase 来设置 postgres(更改日志 xml 来描述设置,然后使用 liquibase-core Kotlin/Java 库来应用它)。我还使用 Hibernate 直接与 postgres 交互。我使用的测试框架是 Kotest,使用 beforeXXX 方法来确保所有设置都在测试运行之前发生。数据库在一切运行之前设置一次,其想法是在每次测试后回滚。
通过查看文档,我发现 tagDatabase 和 rollback 似乎是我需要的,但是在运行它们时,它们似乎并没有真正回滚任何东西。
代码大致如下(这只是测试代码,看看它是否能正常工作,请注意 - 理想情况下,代码会按照我上面的描述进行分段):
// 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