在其他类中将Spring Data JPA与EntityManager混合使用时出错:没有名为'transactionManager'的bean

时间:2018-10-15 14:30:42

标签: java spring-boot spring-data-jpa

我正在从零开始开发一个新项目,我只使用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操作。 savedelete将由Spring实现。因此,我认为这里不需要事务管理。

我是否必须添加一个配置类来告诉我的存储库使用事务管理器?有什么方法可以避免再上课吗?为什么没有它在另一个项目中工作就不能正常工作?

PS:我看到compile("org.springframework.boot:spring-boot-starter-data-redis")中列出了compile("org.springframework.boot:spring-boot-starter-data-jpa")build.gradle。这相关吗?

1 个答案:

答案 0 :(得分:0)

好吧,我发现了原因:我们使用一个名为mitre的OpenID库,并且此依赖项使用EclipseLink作为JPA的实现而不是Hibernate,因此我们不得不在spring-data-jpa中排除hibernate。如果我们要使用JPA-Hibernate,则这两个将混合使用,@Autowired会很容易混淆使用哪一个,因此我们只需要编写类型化查询即可使用此库。这就是为什么现在这样。看来我必须自己编写所有查询。