提问者:小点点

Spring@自动加载EntityManager失败


我正在研究Spring JPA集成,并在尝试使用@了的注释自动装配EntityManager时出现了奇怪的行为。

我有一个没有 Spring 启动上下文支持的 Spring 测试:

@ExtendWith(SpringExtension.class)
class JpaTransactionScopedPersistentContextTests {

    @Configuration
    @ComponentScan(basePackages = {
        "packages"
    })
    static class TestConfiguration {}

    @Autowired
    private EntityAService entityAService;

    @Test
    void testEntityManagerWithoutTransaction () {

        EntityA entityA = new EntityA();

        entityAService.save(entityA);
    }
}

服务定义如下:

    @Service
    public class EntityAService {
    
//        @PersistenceContext - this works
        @Autowired // this fails
        private EntityManager entityManager;
    
        public EntityA save (EntityA entityA) {
            return entityManager.merge(entityA);
        }
    
        @Transactional
        public EntityA saveInTransaction (EntityA entityA) {
            return entityManager.merge(entityA);
        }
    }

我有以下JPA配置:

@EnableTransactionManagement
@Configuration
public class ConfigurationA {

    @Bean
    public DataSource dataSourceWithEmbeddedDatabaseBuilder () throws SQLException {
        return new EmbeddedDatabaseBuilder()
            .setName("test")
            .setType(EmbeddedDatabaseType.H2)
            .addScripts("classpath:/schema.sql")
            .addScripts("classpath:/data.sql")
            .build();
    }


    @Bean
    public LocalContainerEntityManagerFactoryBean entityManagerFactory (DataSource dataSource) {
        LocalContainerEntityManagerFactoryBean entityManagerFactoryBean =
            new LocalContainerEntityManagerFactoryBean();

        entityManagerFactoryBean.setDataSource(dataSource);
        entityManagerFactoryBean.setPackagesToScan("packages");

        JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        entityManagerFactoryBean.setJpaVendorAdapter(vendorAdapter);

        return entityManagerFactoryBean;
    }

    @Bean
    public PlatformTransactionManager jpaTransactionManager (EntityManagerFactory entityManagerFactory) {
        return new JpaTransactionManager(entityManagerFactory);
    }
}

Spring抛出错误:

没有'javax.persistence.EntityManager'类型的合格bean可用:预计至少有1个bean符合自动连接候选条件。

为什么?


共1个答案

匿名用户

经过几个小时的调试,我找到了原因。

这:

@Autowired
private EntityManager entityManager;

仅当您有@EnableJpaRepository注释时才有效。

例如:

@EnableJpaRepositories
@Configuration
public class ConfigurationA {}

也就是说,< code>EntityManager的自动连接是Spring Data JPA模块提供的一个特性。它不是通常的Spring JPA集成所提供的。