добавить менеджер транзакций для приложения Couchbase. в приложении SpringBoot 2 для тестов Junit - PullRequest
2 голосов
/ 22 октября 2019

У меня есть приложение SpringBoot 2, которое использует Couchbase в качестве базы данных с Spring Data Couchbase

Я хочу добавить менеджер транзакций для добавления аннотации @Transactional в тесте, чтобы выполнить откат, в противном случае яполучить эту ошибку:

java.lang.IllegalStateException: Failed to retrieve PlatformTransactionManager for @Transactional test: [DefaultTestContext@3bf9ce3e testClass = RequestServiceIntegrationTest, testInstance = com.pxs.rqm.requestcrud.service.RequestServiceIntegrationTest@1ebcfcf1, testMethod = shouldSaveWhenDataIsOK@RequestServiceIntegrationTest, testException = [null], mergedContextConfiguration = [WebMergedContextConfiguration@16610890 testClass = RequestServiceIntegrationTest, locations = '{}', classes = '{class com.pxs.rqm.requestcrud.Application}', contextInitializerClasses = '[]', activeProfiles = '{}', propertySourceLocations = '{}', propertySourceProperties = '{org.springframework.boot.test.context.SpringBootTestContextBootstrapper=true}', contextCustomizers = set[org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@971d0d8, org.springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@564718df, org.springframework.boot.test.mock.mockito.MockitoContextCustomizer@0, org.springframework.boot.test.web.client.TestRestTemplateContextCustomizer@36f0f1be, org.springframework.boot.test.autoconfigure.properties.PropertyMappingContextCustomizer@0, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverContextCustomizerFactory$Customizer@2145433b], resourceBasePath = 'src/main/webapp', contextLoader = 'org.springframework.boot.test.context.SpringBootContextLoader', parent = [null]], attributes = map['org.springframework.test.context.web.ServletTestExecutionListener.activateListener' -> true, 'org.springframework.test.context.web.ServletTestExecutionListener.populatedRequestContextHolder' -> true, 'org.springframework.test.context.web.ServletTestExecutionListener.resetRequestContextHolder' -> true]]

    at org.springframework.util.Assert.state(Assert.java:94)
    at org.springframework.test.context.transaction.TransactionalTestExecutionListener.beforeTestMethod(TransactionalTestExecutionListener.java:185)

1 Ответ

0 голосов
/ 23 октября 2019

Хотя мы пытаемся поддерживать большую часть интерфейса Spring, интерфейс @Transactional специфичен для реляционных баз данных.

Обновления в Couchbase являются атомарными (все или ничего), и поскольку способ моделирования данных отличается от реляционного, вам обычно не нужны такие транзакции. Подумайте о пользователе, например, все связанные с ним данные (предпочтения, адрес, кредитные карты) будут храниться в одном и том же документе, поэтому в этом случае транзакции обычно не нужны.

Однако,если вам нужно обновить несколько документов одновременно, то вы можете рассмотреть возможность использования новой поддержки транзакций, которая пока доступна только в SDK 3 (https://www.couchbase.com/transactions)

...