Я работал над новым проектом с нуля, я просто использую JpaRepository
и никакие дополнительные @Bean
, @Qualifier(value = "xxx")
или @Configuration
не используются, благодаря Spring Data JPA.
Теперь я начинаю добавлять код в старый проект и вижу классы, использующие EntityManager
и @Transactional
и типизированные запросы.Я думаю, что они не нужны.
Поэтому я хочу добавить свой новый стиль хранилища, сохраняя старый код без изменений, но в этом классе и его тесте я вижу ошибки:
org.springframework.beans.factory.NoSuchBeanDefinitionException: нет доступного компонента с именем «actionManager »: не найдено ни одного соответствующего компонента PlatformTransactionManager для квалификатораactionManager - ни совпадения ни с квалификатором, ни с именем компонента!
Репозиторий: 1017*
public interface UserPurchaseRepository extends JpaRepository<UserPurchase, Long> {
/**
* Find the last purchase time of a user.
* @param userId the id of user to search
* @return the last buy time
*/
OffsetDateTime findLastBuyDateByUserId(String userId);
}
Тест:
@RunWith(SpringRunner.class)
@AutoConfigureTestDatabase
@SpringBootTest
public class UserPurchaseServiceIntegrationTest {
private static final String id = UUID.randomUUID().toString();
private static final String userId = UUID.randomUUID().toString();
private static final OffsetDateTime lastBuyDate = OffsetDateTime.now();
@Autowired
private UserPurchaseRepository repository;
@Before
public void setUp() {
UserPurchase purchase = new UserPurchase();
purchase.setId(id);
purchase.setUserId(userId);
purchase.setLastBuyDate(lastBuyDate);
repository.save(purchase);
}
@After
public void cleanUp() {
repository.deleteAll();
}
@Test
public void testFindLastBuyTimeByUserId() {
// given (setUp())
// when
OffsetDateTime foundLastBuyTime = repository.findLastBuyDateByUserId(userId);
// then
Assert.assertEquals(lastBuyDate, foundLastBuyTime);
}
}
Обратите внимание, что здесь @Transactional
не требуется, поскольку это операция find
.save
или delete
будут реализованы Spring.Итак, я думаю, что управление транзакциями здесь не нужно.
Нужно ли добавлять класс конфигурации, чтобы указать моему хранилищу использовать диспетчер транзакций?Есть ли способы избежать другого класса?Почему он не может просто работать, пока не работает в другом проекте?
PS: я видел, что compile("org.springframework.boot:spring-boot-starter-data-redis")
и compile("org.springframework.boot:spring-boot-starter-data-jpa")
оба перечислены в build.gradle
.Это актуально?