SpringBoot3创建entityManagerFactory失败:原SpringBoot2配置失效
升级SpringBoot3后,原SpringBoot2中正常运行的数据源配置出现以下错误:
无法构建Hibernate SessionFactory;嵌套异常为java.lang.IllegalArgumentException: dataSource or dataSourceClassName or jdbcUrl is required。
问题原因
SpringBoot3对DataSourceBuilder的初始化逻辑做了调整,直接调用DataSourceBuilder.create().build()时,若配置属性未被正确绑定,会导致数据源实例不完整。另外自定义EntityManagerFactory时,缺少必要的JPA属性传递,也会让Hibernate无法正确识别数据源配置。
解决方案
1. 修复DataSource Bean的构建方式
确保DataSourceBuilder正确加载配置属性,推荐指定连接池类型(SpringBoot3默认使用HikariCP):
@Bean("dataSource") @Primary @ConfigurationProperties(prefix = "spring.datasource") public DataSource dataSource() { return DataSourceBuilder.create().type(HikariDataSource.class).build(); }
如果没有特殊定制需求,甚至可以直接删除这个自定义DataSource Bean,SpringBoot会自动根据spring.datasource前缀的配置创建数据源。
2. 完善EntityManagerFactory配置
在自定义EntityManagerFactory时,补充JPA属性配置,让Hibernate能获取到必要的方言等设置:
@Primary @Bean(name = "entityManagerFactory") public LocalContainerEntityManagerFactoryBean entityManagerFactory( @Qualifier("dataSource") DataSource dataSource, Environment environment) { LocalContainerEntityManagerFactoryBean emfBean = new LocalContainerEntityManagerFactoryBean(); emfBean.setDataSource(dataSource); emfBean.setPackagesToScan("com.entity"); emfBean.setJpaVendorAdapter(jpaVendorAdapter()); // 加载JPA配置属性 Properties jpaProps = new Properties(); jpaProps.put("hibernate.dialect", environment.getProperty("spring.jpa.properties.hibernate.dialect")); // 可根据需要添加其他Hibernate配置,比如DDL策略等 jpaProps.put("hibernate.hbm2ddl.auto", environment.getProperty("spring.jpa.hibernate.ddl-auto")); emfBean.setJpaProperties(jpaProps); return emfBean; }
3. 检查配置文件正确性
确保application.properties(或yml)中的数据源配置完整:
spring.datasource.url=jdbc:mysql://localhost:3306/your_database spring.datasource.username=db_user spring.datasource.password=db_pwd spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver # JPA相关配置 spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect spring.jpa.hibernate.ddl-auto=update
4. 简化配置(推荐)
如果没有特殊的定制需求,完全可以去掉自定义的DataSourceConfiguration类,只保留@EnableJpaRepositories在启动类上,SpringBoot的自动配置会帮你创建DataSource、EntityManagerFactory和TransactionManager,大幅减少配置代码。
内容的提问来源于stack exchange,提问作者snehalg

