使用@PersistenceContext注入EntityManager失败,提示找不到'Foo' Bean
你遇到的NoSuchBeanDefinitionException: No bean named 'Foo' available本质原因是:仅通过persistence.xml中的持久化单元名称,没办法让Spring自动完成EntityManager的注入。Spring需要你显式配置对应的JPA工厂Bean,才能识别并加载persistence.xml里的持久化单元配置,进而提供可注入的EntityManager实例。
为什么当前配置不行?
你的Config类只开启了组件扫描,但没有注册任何与JPA相关的核心Bean(比如EntityManagerFactory)。Spring容器里没有对应"Foo"持久化单元的管理Bean,自然找不到可以注入的EntityManager。
具体解决步骤
1. 完善配置类,添加JPA核心Bean
修改你的Config类,添加LocalContainerEntityManagerFactoryBean和PlatformTransactionManager的配置:
@Configuration @ComponentScan("com.foo.package") @EnableTransactionManagement // 开启事务管理 public class Config { @Bean public LocalContainerEntityManagerFactoryBean entityManagerFactory() { LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean(); // 指定persistence.xml中的持久化单元名称 em.setPersistenceUnitName("Foo"); // 若persistence.xml不在默认META-INF路径下,可通过此属性指定位置,默认路径可省略 // em.setPersistenceXmlLocation("classpath:META-INF/persistence.xml"); return em; } @Bean public PlatformTransactionManager transactionManager(EntityManagerFactory emf) { JpaTransactionManager transactionManager = new JpaTransactionManager(); transactionManager.setEntityManagerFactory(emf); return transactionManager; } }
2. 补充Hibernate依赖(必要)
你的persistence.xml指定了org.hibernate.jpa.HibernatePersistenceProvider作为JPA实现,但当前pom.xml未显式引入Hibernate核心依赖,可能导致类找不到的问题,建议添加:
<dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>5.4.32.Final</version> <!-- 版本可与你的Spring版本适配调整 --> </dependency>
3. 验证注入逻辑
修改后的配置中,LocalContainerEntityManagerFactoryBean会读取persistence.xml里的"Foo"单元配置,创建对应的EntityManagerFactory。此时@PersistenceContext(unitName="Foo")就能从Spring容器中获取到正确的EntityManager实例了。
额外说明
- 如果你使用Spring Boot,配置会更简化(比如
@SpringBootApplication自动扫描+spring.jpa.persistence-unit-name配置),但当前你用的是纯Spring框架,所以需要手动配置这些核心Bean。 @EnableTransactionManagement虽然是可选配置,但如果涉及数据库增删改操作,事务管理是必不可少的,否则会抛出事务相关异常。
内容的提问来源于stack exchange,提问作者Marc

