我正在研究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符合自动连接候选条件。
为什么?
经过几个小时的调试,我找到了原因。
这:
@Autowired
private EntityManager entityManager;
仅当您有@EnableJpaRepository
注释时才有效。
例如:
@EnableJpaRepositories
@Configuration
public class ConfigurationA {}
也就是说,< code>EntityManager的自动连接是Spring Data JPA模块提供的一个特性。它不是通常的Spring JPA集成所提供的。