配置Jakarta Persistence3.0+Hibernate5.6遇持久化提供者缺失错误求助
解决Jakarta Persistence 3.0的"No Persistence provider"错误
针对你遇到的jakarta.persistence.PersistenceException: No Persistence provider for EntityManager named myPersistence错误,以下是具体的排查和修复步骤:
核心问题排查
这个错误通常由以下几个原因导致:
- Hibernate依赖未正确引入或版本不兼容
persistence.xml文件位置不符合JPA规范- 实体类缺少JPA强制要求的无参构造器
- 缺少MySQL数据库驱动依赖
分步修复
1. 修正Maven依赖配置
Hibernate 5.6.x完全兼容Jakarta Persistence 3.0,确保依赖完整且版本匹配,同时添加MySQL驱动:
<dependencies> <!-- Jakarta Persistence API --> <dependency> <groupId>jakarta.persistence</groupId> <artifactId>jakarta.persistence-api</artifactId> <version>3.0.0</version> <scope>provided</scope> </dependency> <!-- Hibernate核心实现 --> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>5.6.15.Final</version> <!-- 优先使用稳定的最新小版本 --> </dependency> <!-- MySQL JDBC驱动 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.33</version> </dependency> </dependencies>
注:将
jakarta.persistence-api设为provided是因为Hibernate核心已经包含了兼容的API版本,避免重复依赖冲突。
2. 确认persistence.xml的位置
必须把persistence.xml放在项目的src/main/resources/META-INF/目录下,这是JPA规范规定的默认扫描路径,否则Persistence Provider无法加载配置。
3. 给实体类添加无参构造器
JPA强制要求实体类必须有一个公共或受保护的无参构造器,Hibernate需要通过反射创建实体实例。修改BookAuthor类:
// 添加无参构造器 public BookAuthor() {} // 保留原有的带参构造器 public BookAuthor(String first, String last, String bio) { this.first = first; this.last = last; this.bio = bio; }
4. 补充Hibernate方言配置(可选但推荐)
在persistence.xml的properties中添加方言配置,避免Hibernate自动检测数据库方言出错:
<properties> <!-- 原有数据库连接配置 --> <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL8Dialect"/> </properties>
5. 优化主方法的资源管理
主方法中需要确保资源在异常时也能正确关闭,避免内存泄漏:
public static void main(String[] args) { EntityManagerFactory emf = null; EntityManager em = null; try { emf = Persistence.createEntityManagerFactory("myPersistence"); em = emf.createEntityManager(); EntityTransaction transaction = em.getTransaction(); transaction.begin(); BookAuthor author = new BookAuthor("Sadiul", "Hakim", "I am a Full Stack Java Developer."); em.persist(author); transaction.commit(); } catch (Exception e) { e.printStackTrace(); // 异常时回滚事务 if (em != null && em.getTransaction().isActive()) { em.getTransaction().rollback(); } } finally { // 关闭资源 if (em != null) em.close(); if (emf != null) emf.close(); } }
验证方法
- 执行
mvn clean compile确保依赖下载完成且编译无错误 - 运行主方法,检查MySQL数据库中是否生成了
BookAuthor表并插入了对应数据
内容的提问来源于stack exchange,提问作者sadiul-hakim
相关产品推荐
相关产品推荐

