找不到bean
在使用jpa时报错
Consider defining a bean named 'entityManagerFactory' in your configuration.
网上搜了搜,用chatgpt生成了一段代码,来解决这个问题,下图中的3个bean都是chatgpt为我生成的,还有@EnableJpaRepositories也是chatgpt让我用的(错误不在这,除了@EnableJpaRepositories必须的,其他bean都不需要)
@Configuration
//事务相关,数据库service的实现方法上,加 @Transactional 就可以实现数据库事务了
//@EnableTransactionManagement
//jpa扫描repository注入目录
//@EnableJpaRepositories(basePackages = "com.app.api.service.administrator.dao")
//扫描JPA实体类
//@EntityScan(basePackages = {"com.app.api.service.administrator.dao.po"})
@EnableJpaRepositories
public class AutoConfiguration {
@Autowired
private Environment env;
@Bean
public DataSource dataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName(env.getProperty("spring.datasource.driver-class-name"));
dataSource.setUrl(env.getProperty("spring.datasource.url"));
dataSource.setUsername(env.getProperty("spring.datasource.username"));
dataSource.setPassword(env.getProperty("spring.datasource.password"));
return dataSource;
}
@Bean(name = "entityManagerFactory")
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
em.setDataSource(dataSource());
em.setPackagesToScan("com.example.entity");
em.setJpaVendorAdapter(new HibernateJpaVendorAdapter());
em.setJpaProperties(additionalProperties());
return em;
}
@Bean
public PlatformTransactionManager transactionManager() {
JpaTransactionManager transactionManager = new JpaTransactionManager();
transactionManager.setEntityManagerFactory(entityManagerFactory().getObject());
return transactionManager;
}
private Properties additionalProperties() {
Properties properties = new Properties();
properties.setProperty("hibernate.hbm2ddl.auto", env.getProperty("spring.jpa.hibernate.ddl-auto"));
properties.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQL8Dialect");
properties.setProperty("hibernate.show_sql", env.getProperty("spring.jpa.show-sql"));
return properties;
}
}
找不到实体类
然后这个问题解决了,我又遇到了新的问题Not a managed type

既然扫描不到我的实体类,我继续搜解决办法,增加了@EntityScan注解(见上面代码),没有生效
然后我又使用@ComponentScan去扫描实体类,这次不报错了,但是上面新建的3个Bean扫描不到了,而且也无法自动生成数据表(我在配置文件中配置了自动生成表格)
问题解决
最后找到了问题原因,在启动类的@SpringBootApplication中多了个exclude={DataSourceAutoConfiguration.class}导致自动配置数据源的类被排除了
@SpringBootApplication(
scanBasePackages = {
"com.app.api",
"com.app.api.*.*.dao.po",
},
//不允许自动注入数据源,该项会导致jpa相关注解扫描实体类或Repository失败导致报错
exclude = {DataSourceAutoConfiguration.class}
)
别忘了@EnableJpaRepositories加到启动类或配置类上
在SpringBoot应用中使用JPA时遇到找不到beanentityManagerFactory的问题。通过添加@EnableJpaRepositories注解和手动配置dataSource、entityManagerFactory、transactionManager的bean解决了问题。但随后实体类未被扫描到,尝试使用@EntityScan和@ComponentScan后发现冲突。最终发现是@SpringBootApplication中的exclude参数排除了DataSourceAutoConfiguration,移除该排除解决了所有问题。
942

被折叠的 条评论
为什么被折叠?



