学习使用JPA遇到的一些问题

在SpringBoot应用中使用JPA时遇到找不到beanentityManagerFactory的问题。通过添加@EnableJpaRepositories注解和手动配置dataSource、entityManagerFactory、transactionManager的bean解决了问题。但随后实体类未被扫描到,尝试使用@EntityScan和@ComponentScan后发现冲突。最终发现是@SpringBootApplication中的exclude参数排除了DataSourceAutoConfiguration,移除该排除解决了所有问题。

找不到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加到启动类或配置类上

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值