java - Spring @Autowired EntityManager 失败

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

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

我有一个没有 Spring Boot 上下文支持的 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 个符合 Autowiring 候选资格的 bean。

为什么?

最佳答案

经过几个小时的调试一堆内部 Spring 代码后,我找到了原因。

这个:

@Autowired
private EntityManager entityManager;

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

例如:

@EnableJpaRepositories
@Configuration
public class ConfigurationA {}

也就是说,EntityManager的 Autowiring 是Spring Data JPA模块提供的一项功能。通常的 Spring JPA 集成不提供它。

关于java - Spring @Autowired EntityManager 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66078904/

相关文章:

java - 从java连接到Berkeley DB的问题

java - 如何更换 ignite 缓存?

java - 如何使用 Spring Boot 在 Spring Batch 中以不同顺序读取 csv 列

java - Spring Security 中 PreAuthenticatedAuthenticationToken 的用途?

java - 为JMS组件设置TaskExecutor

java - 如何从随机数系列中排除某个数字?

java - 模式/正则表达式*仅*如果它是记录中的唯一字段

java - .tmp 文件未在多部分 Spring MVC 文件上传中删除

java - 如何更改 Java Keystore(JKS) keystore 和别名密码以便它们正常工作

spring-boot - 有没有办法用 SpringBoot 启动 FXGL?