Правильно зафиксировать базу данных, используя @Transactional в spring-data - PullRequest
0 голосов
/ 13 мая 2019

У меня есть тестовая функция, которая должна выполнить следующую задачу

  1. вставить данные в дБ
  2. запросить базу данных и убедиться, что данные соответствуют ожиданиям

Проблема в том, что в моем тесте данные не были переданы в БД, как будто они застряли на каком-то шаге transactional, как я могу обязательно зафиксировать данные перед выполнением второго запроса.

Это часть моей тестовой функции, @Rollback(false) только для стадии разработки.

@Test
@Rollback(false)
....
reportJobManager.saveOutput(savedDef, pipeline, results, null)
reportJobManager.retryRetention(savedDef, listOf(csvDeliverbale))

Функция saveOutput. пример кода

@Transactional
fun saveOutput() {
    if (deliverable.type.name == "DATA_RETENTION_RESULT") {
        finishedPipeline.postProcessors.forEach {
            //it(definition, dbDeliverable)
            val dbRetention = ReportRetention(
                deliverable = dbDeliverable,
                definition = definition,
                retryCount = 1L
            )
            val retentionUploadSaved = retentionRepository.save(dbRetention)
            if (retentionUploadSaved.id == null) {
                throw IllegalStateException("Retention upload was not saved!")
            }
        }
    }
}

retryRetention функциональный код

fun retryRetention(definition: ReportDefinition, listOfDeliverables: List<Deliverable>) {
        retentionRepository.findAll().forEach {
            if (it.state.name == "NOT_UPLOADED" && it.retryCount!!.toInt() < 5) {
                if (it.deliverable?.success == true) {
                    it.state = RetentionUploadStatus.UPLOADED
                    println("RetentionUploadStatus->UPLOADED")
                } else {
                    val schemaService = SchemaServiceImpl()
                    val schemas = schemaService.initializeSchemas(definition, emptyMap())
                    val parameters = definition.parameterPolicy.policy(schemas.parametersSchema)
                    val delivery = deliveryPolicyService.policy<Deliverable>(ValidDeliveryPolicy.RETENTION_ONLY, schemas.deliverySchema)
                    val deliveryFunction = delivery.createDeliveryStep()
                    deliveryFunction(parameters, listOfDeliverables)
                    it.retryCount = it.retryCount!!.plus(1L)
                }
                retentionRepository.save(it)
            }
        }
    }

1 Ответ

1 голос
/ 13 мая 2019

Если у вас есть метод saveOutput() с аннотацией @Transactional, вам нужно добавить @Transactional над каждым другим методом, вызывающим saveOutput(), чтобы транзакция фактически зафиксировала.

...