Spring Boot Maven项目启动失败,EntityManagerFactory创建报错:SpringHibernateJpaPersistenceProvider未实现jakarta.persistence.spi.PersistenceProvider
Spring Boot Maven项目启动失败,EntityManagerFactory创建报错:SpringHibernateJpaPersistenceProvider未实现jakarta.persistence.spi.PersistenceProvider
你好,从你提供的错误信息和代码来看,这个问题的核心是Jakarta EE与Java EE的API不兼容,以及依赖版本不匹配导致的。Spring Boot 3.x已经全面切换到Jakarta EE规范(取代了原来的Java EE),而你使用的Hibernate 5.x还是基于旧的Java EE(javax.persistence),这就造成了接口实现不匹配的问题。
错误日志
Error starting ApplicationContext. To display the condition evaluation report re-run your application with 'debug' enabled. 2023-03-20T14:40:56.700+01:00 ERROR 13448 --- [ restartedMain] o.s.boot.SpringApplication : Application run failed org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Class org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider does not implement the requested interface jakarta.persistence.spi.PersistenceProvider at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1762) ~[spring-beans-6.0.6.jar:6.0.6] ...(省略中间重复栈信息) Caused by: java.lang.IncompatibleClassChangeError: Class org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider does not implement the requested interface jakarta.persistence.spi.PersistenceProvider at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:376) ~[spring-orm-6.0.6.jar:6.0.6] ...(省略中间重复栈信息)
你的Task实体类
package com.taskManager.Entities; import java.time.LocalDateTime; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; @Entity(name = "task") public class Task { @Id @GeneratedValue(strategy=GenerationType.AUTO) private Long id; @Column(nullable = false) private String name; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "user_id") private User user; private String description; private LocalDateTime date; public Task(Long id, String name, User user, String description, LocalDateTime date) { super(); this.id = id; this.name = name; this.user = user; this.description = description; this.date = date; } public Task(String name, User user, String description, LocalDateTime date) { super(); this.name = name; this.user = user; this.description = description; this.date = date; } // Getters and Setters public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public User getUser() { return user; } public void setUser(User user) { this.user = user; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } public LocalDateTime getDate() { return date; } public void setDate(LocalDateTime date) { this.date = date; } }
你的pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.0.4</version> <relativePath /> <!-- lookup parent from repository --> </parent> <groupId>com.taskManager</groupId> <artifactId>Task-Manager</artifactId> <version>0.0.1-SNAPSHOT</version> <name>Task-Manager</name> <description>Application for managing differentes taks</description> <properties> <java.version>17</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>5.6.9.Final</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-entitymanager</artifactId> <version>5.6.9.Final</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.18</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>javax.xml.bind</groupId> <artifactId>jaxb-api</artifactId> <version>2.3.0</version> </dependency> <dependency> <groupId>jakarta.persistence</groupId> <artifactId>jakarta.persistence-api</artifactId> <version>3.0.0</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
你的application.properties
spring.jpa.hibernate.ddl-auto=update spring.datasource.url=jdbc:mysql://localhost:3306/taskmanager spring.datasource.username=root spring.datasource.password=root spring.datasource.driver-class-name=com.mysql.jdbc.Driver
你已尝试的方案
- 修改pom.xml中的Hibernate版本
- 添加/修改hibernate-entitymanager和hibernate-core依赖
- 执行
mvn clean、mvn install,重启IDE,尝试多种启动方式 - 移除实体类中的@Id注解
- 将
import javax.persistence.Id;替换为import org.springframework.data.annotation.Id;
解决方案
下面是针对你的问题的具体修复步骤,按顺序执行:
1. 修正依赖版本与冲突
Spring Boot 3.x的spring-boot-starter-data-jpa已经默认集成了Hibernate 6.x(适配Jakarta EE),你手动添加的Hibernate 5.x依赖和jakarta.persistence-api会造成冲突,需要删除这些手动添加的依赖:
- 删除
hibernate-core和hibernate-entitymanager依赖 - 删除
jakarta.persistence-api依赖 - 将
mysql-connector-java替换为mysql-connector-j(Spring Boot 3.x推荐的新坐标,版本由parent自动管理) - 删除
jaxb-api依赖(如果需要JAXB,Spring Boot 3.x可以用spring-boot-starter-jaxb)
修改后的pom.xml核心依赖部分如下:
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-test</artifactId> <scope>test</scope> </dependency> <!-- 使用Spring Boot推荐的MySQL驱动坐标 --> <dependency> <groupId>com.mysql</groupId> <artifactId>mysql-connector-j</artifactId> <scope>runtime</scope> </dependency> <!-- Spring Boot JPA starter,自动集成适配的Hibernate版本 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <!-- 如果需要JAXB,添加这个starter --> <!-- <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jaxb</artifactId> </dependency> --> </dependencies>
2. 替换实体类中的JPA注解包
Spring Boot 3.x使用Jakarta EE的API,所以需要把实体类中所有javax.persistence.*的导入替换为jakarta.persistence.*:
比如把:
import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne;
替换为:
import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.FetchType; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; import jakarta.persistence.JoinColumn; import jakarta.persistence.ManyToOne;
3. 修正application.properties中的数据库驱动类
MySQL 8.0+的驱动类已经更新为com.mysql.cj.jdbc.Driver,旧的com.mysql.jdbc.Driver已经废弃,所以修改application.properties:
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
4. 清理并重新构建项目
执行以下Maven命令,清理旧的构建文件并重新安装依赖:
mvn clean install -U
然后重启IDE,再尝试启动项目。
备注:内容来源于stack exchange,提问作者jorge
相关产品推荐
相关产品推荐

