我正在从零开始开发一个新项目,我只使用JpaRepository
而没有多余的@Bean
,
多亏了Spring Data JPA,使用了@Qualifier(value = "xxx")
或@Configuration
。
现在,我开始向旧项目中添加代码,并且看到使用EntityManager
和@Transactional
的类以及键入查询。我认为它们不是必需的。
所以我想在保持旧代码完整的同时添加新样式的存储库,但是此类及其测试却出现了错误:
org.springframework.beans.factory.NoSuchBeanDefinitionException:没有提供名为'transactionManager'的bean:找不到与限定符'transactionManager'匹配的PlatformTransactionManager bean-限定符不匹配,bean名称不匹配!
存储库:
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
。这相关吗?
答案 0 :(得分:0)
好吧,我发现了原因:我们使用一个名为mitre
的OpenID库,并且此依赖项使用EclipseLink作为JPA的实现而不是Hibernate,因此我们不得不在spring-data-jpa
中排除hibernate。如果我们要使用JPA-Hibernate,则这两个将混合使用,@Autowired
会很容易混淆使用哪一个,因此我们只需要编写类型化查询即可使用此库。这就是为什么现在这样。看来我必须自己编写所有查询。