我正在使用JDBI为单独项目中的测试场景(设置前提条件)准备数据(请放心)。现在,我必须使用基于JDBI的Daos在生产项目中进行集成测试。
示例数据设置Dao如下所示:
class DocumentDao(jdbi: Jdbi) : DefaultCrudRepository<Document>(jdbi) {
/* ... */
override fun save(entity: Document, handle: Handle): Int {
return handle.createUpdate(
"""
INSERT INTO documents (
/* ... */
)
VALUES (
/* ... */
)
"""
)
.bindBean(entity)
.execute()
}
/* ... */
}
现在,我必须将其与生产持久性框架一起使用,因为集成测试中的每个方案都是在单个事务中执行的。因此,前提条件插入和数据库中的生产数据修改都必须在单个事务中发生并回滚。像这样:
@Test
public void LoadDocument_001() throws Exception
{
// Start a transaction
startTx();
Integer id = testDocumentDao.nextIdFromSequence();
// Insert fake document into DB as a test precondition
test.document.Document document = new test.document.Document(/* ... */);
testDocumentDao.save(document);
// Production Dao (subject) is called
Document loadedDocument = subject.load(id.toString());
// Rollback the transaction
rollbackTx();
}
我可以使用startTx()和rollbackTx()通过直接与连接通信来手动控制事务的方法。但!我无法控制那些由JDBI支持的Daos的交易。使用JDBI的每个操作碰巧都由JDBI自动提交。因此,我作为先决条件创建的文档将在测试完成后保留在数据库中。
注意:当然,我在JDBI和生产持久性层中使用相同的连接实例。
所以我有两个问题:
如何为仅JDBI操作进行手动事务管理?例如,像上面的示例一样,我构建了两个Daos(DocumentDao和CustomerDao)。我想对它们两个都调用方法,但是我希望所有更改都在单个事务中发生。然后我想回滚该事务。
如何将JDBI操作的手动事务管理与其他非JDBI代码混合使用?例如。我正在使用DocumentDao,还使用了一些正在更改数据库状态的生产代码。如何使用JDBI和/或直接与连接通信来控制事务?我是否必须以某种方式禁用JDBI中的自动交易管理?我尝试使用带有空方法的伪造TransactionHandler来执行此操作,但是它没有任何效果。