You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Spring Boot启动报错:找不到名为entityManagerFactory的Bean

Spring Boot启动失败:找不到entityManagerFactory Bean的解决方案

先来看下你提供的启动错误日志:

____ _ __ _ _ 
/\ / ' __ _ ( ) __ __ _ \ \ \
( ( )_ _ | '_ | ' | | ' / ` | \ \
\/ __ )| | )| | | | | || ( | | ) ) ) ) 
' | | .__| | | | | | _ , | / / / / 
=========| |==============| /=/ / / / 
:: Spring Boot :: (v2.3.3.RELEASE)

2020-08-30 18:09:53.081 INFO 4536 --- [ restartedMain] com.App.Shopping.ShoppingApplication : 正在DESKTOP-DSCQJON上启动ShoppingApplication,PID为4536(由sarat在D:\sarat\eclipse-workspace\Shopping.zip_expanded\Shopping目录启动,路径为D:\sarat\eclipse-workspace\Shopping.zip_expanded\Shopping\target\classes)
2020-08-30 18:09:53.081 INFO 4536 --- [ restartedMain] com.App.Shopping.ShoppingApplication : 未设置活跃配置文件,回退到默认配置文件:default
2020-08-30 18:09:53.148 INFO 4536 --- [ restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : 以DEFAULT模式引导Spring Data JPA仓库。
2020-08-30 18:09:53.151 INFO 4536 --- [ restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Spring Data仓库扫描完成,耗时3ms,发现1个JPA仓库接口。
2020-08-30 18:09:53.256 INFO 4536 --- [ restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat已初始化,端口为:8083(http)
2020-08-30 18:09:53.256 INFO 4536 --- [ restartedMain] o.apache.catalina.core.StandardService : 正在启动服务[Tomcat]
2020-08-30 18:09:53.256 INFO 4536 --- [ restartedMain] org.apache.catalina.core.StandardEngine : 正在启动Servlet引擎:[Apache Tomcat/9.0.37]
2020-08-30 18:09:53.325 INFO 4536 --- [ restartedMain] org.apache.jasper.servlet.TldScanner : 至少有一个JAR被扫描TLD但未包含任何TLD。启用此日志记录器的调试日志可获取完整的扫描JAR列表。跳过不必要的JAR扫描可提升启动和JSP编译时间。
2020-08-30 18:09:53.327 INFO 4536 --- [ restartedMain] o.a.c.c.C.[Tomcat-24].[localhost].[/] : 正在初始化Spring嵌入式WebApplicationContext
2020-08-30 18:09:53.327 INFO 4536 --- [ restartedMain] w.s.c.ServletWebServerApplicationContext : 根WebApplicationContext初始化完成,耗时244ms
2020-08-30 18:09:53.339 WARN 4536 --- [ restartedMain] ConfigServletWebServerApplicationContext : 上下文初始化期间遇到异常,取消刷新尝试:org.springframework.beans.factory.UnsatisfiedDependencyException: 创建名为'shoppingController'的Bean出错:通过字段'userservice'表达的依赖不满足;嵌套异常为org.springframework.beans.factory.UnsatisfiedDependencyException: 创建名为'userServiceImpl'的Bean出错:通过字段'repository'表达的依赖不满足;嵌套异常为org.springframework.beans.factory.BeanCreationException: 创建在ShoppingApplication上@EnableJpaRepositories声明的com.App.Shopping.model.repository.UserRepository中定义的名为'userRepository'的Bean出错:设置Bean属性'entityManager'时无法创建类型为[org.springframework.orm.jpa.SharedEntityManagerCreator]的内部Bean '(inner bean)#71a2245c';嵌套异常为org.springframework.beans.factory.BeanCreationException: 创建名为'(inner bean)#71a2245c'的Bean出错:设置构造函数参数时无法解析对Bean 'entityManagerFactory'的引用;嵌套异常为org.springframework.beans.factory.NoSuchBeanDefinitionException: 找不到名为'entityManagerFactory'的Bean
2020-08-30 18:09:53.340 INFO 4536 --- [ restartedMain] o.apache.catalina.core.StandardService : 正在停止服务[Tomcat]
2020-08-30 18:09:53.344 INFO 4536 --- [ restartedMain] ConditionEvaluationReportLoggingListener : 启动ApplicationContext出错。重新运行应用并启用'debug'可显示条件报告。
2020-08-30 18:09:53.400 ERROR 4536 --- [ restartedMain] o.s.b.d.LoggingFailureAnalysisReporter : 应用启动失败
描述:com.App.Shopping.model.service.UserServiceImpl中的repository字段需要名为'entityManagerFactory'的Bean,但未找到。注入点带有以下注解:
- @org.springframework.beans.factory.annotation.Autowired(required=true)
动作:考虑在配置中定义名为'entityManagerFactory'的Bean。

问题分析

从日志里能清晰看到,整个启动失败的根源是Spring容器找不到entityManagerFactory这个Bean。这个Bean是Spring Boot自动配置JPA时默认创建的,负责管理JPA的实体管理器,现在它缺失导致JPA仓库初始化失败,进而引发了依赖注入的连锁错误。

一步步解决问题

1. 检查项目依赖是否齐全

首先确认你的pom.xml(Maven)或build.gradle(Gradle)里有没有包含Spring Data JPA和对应数据库的驱动依赖,这是自动配置entityManagerFactory的基础:

Maven示例(pom.xml)

<!-- Spring Data JPA 核心依赖 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

<!-- MySQL驱动(根据你用的数据库替换,比如Oracle、PostgreSQL) -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtime</scope>
</dependency>

Gradle示例(build.gradle)

implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
runtimeOnly 'mysql:mysql-connector-java'

如果这些依赖缺失,Spring Boot根本无法触发JPA的自动配置流程。

2. 验证数据库配置是否正确

打开你的application.propertiesapplication.yml,检查数据库连接配置是否准确,比如地址、用户名、密码、驱动类名:

application.properties示例

# 数据库连接信息
spring.datasource.url=jdbc:mysql://localhost:3306/你的数据库名?useSSL=false&serverTimezone=UTC
spring.datasource.username=你的数据库用户名
spring.datasource.password=你的数据库密码
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

# JPA相关配置
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect

配置错误会导致Spring无法创建数据源,进而无法生成entityManagerFactory

3. 确认主启动类的注解配置

你的主启动类ShoppingApplication已经加了@EnableJpaRepositories,但要确保这个注解的basePackages指向了你的JPA仓库所在的包,或者主启动类本身在根包下(这样Spring会自动扫描所有子包):

package com.App.Shopping;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;

@SpringBootApplication
@EnableJpaRepositories(basePackages = "com.App.Shopping.model.repository") // 明确指定仓库所在包
public class ShoppingApplication {
    public static void main(String[] args) {
        SpringApplication.run(ShoppingApplication.class, args);
    }
}

如果包路径指定错误,Spring找不到你的仓库接口,也会影响entityManagerFactory的创建。

4. 手动配置entityManagerFactory(自动配置失效时)

如果以上步骤都试过还是不行,可以手动创建这个Bean,写一个JPA配置类:

package com.App.Shopping.config;

import javax.persistence.EntityManagerFactory;
import javax.sql.DataSource;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
import org.springframework.transaction.PlatformTransactionManager;

@Configuration
public class JpaConfig {

    @Bean
    public LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource dataSource) {
        LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
        em.setDataSource(dataSource);
        em.setPackagesToScan("com.App.Shopping.model"); // 你的实体类所在包路径

        HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        em.setJpaVendorAdapter(vendorAdapter);

        return em;
    }

    @Bean
    public PlatformTransactionManager transactionManager(EntityManagerFactory emf) {
        JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(emf);
        return transactionManager;
    }
}

这个配置类会手动生成entityManagerFactory和事务管理器,替代Spring Boot的自动配置。

内容的提问来源于stack exchange,提问作者Sarath Kumar

火山引擎 最新活动