You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.23 10:47:39