使用JPA时频繁遇ClassNotFoundException及No Persistence provider错误求助
兄弟,我之前折腾JPA的时候也碰到过一模一样的俩问题,给你拆解下怎么解决:
1. 搞定java.lang.ClassNotFoundException: org.hibernate.boot.registry.classloading.spi.ClassLoaderService
这个报错本质就是Hibernate核心依赖要么缺了,要么版本乱了,按这几步排查:
- 先检查你的依赖组合:如果用的是Hibernate 5.x及以上版本,一定要确保
hibernate-core是核心依赖,而且所有Hibernate相关的组件(比如hibernate-entitymanager)版本必须统一,不能一个用5.2一个用5.4,版本冲突必出问题。 - 划重点:Hibernate 5.3之后,
hibernate-entitymanager已经被合并到hibernate-core里了,不需要单独引入,多引反而会搞出冲突。 - 最后确认下依赖有没有真的下载下来:比如Maven的话,去本地仓库看看对应版本的jar包是不是完整的,有时候网络问题会导致依赖下载不全,清理下构建缓存重新拉取就行。
2. 解决"No Persistence provider for EntityManager named LibraryJPA"
这个问题大多和你的persistence.xml配置不全或者位置不对有关,先看你贴的配置明显没写完(最后<class>model.Primerak&l截断了),先把坑填上:
- 位置要对:
persistence.xml必须放在src/main/resources/META-INF目录下(普通Java项目),或者Web项目的WEB-INF/classes/META-INF里,放错地方JPA容器根本找不到它。 - 补全配置:先把未闭合的标签补全,比如最后那个类标签要写成
<class>model.Primerak</class>,然后把</persistence-unit>和</persistence>都加上。 - 明确指定持久化提供者:在
<persistence-unit>里加上<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>,别让容器瞎猜,直接告诉它用Hibernate。 - 补上必要的数据库配置:没有数据源配置的话,JPA也没法工作,比如加上数据库驱动、URL、用户名密码这些属性,示例如下:
<properties> <property name="hibernate.connection.driver_class" value="com.mysql.cj.jdbc.Driver"/> <property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/your_db?useSSL=false&serverTimezone=UTC"/> <property name="hibernate.connection.username" value="root"/> <property name="hibernate.connection.password" value="your_password"/> <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL8Dialect"/> <property name="hibernate.show_sql" value="true"/> </properties>
- 顺便检查下实体类的注解:比如每个实体类都加了
@Entity,主键加了@Id,别漏了这些基本配置。
给你一个完整可参考的persistence.xml示例
<?xml version="1.0" encoding="UTF-8"?> <persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" version="2.0"> <persistence-unit name="LibraryJPA" transaction-type="RESOURCE_LOCAL"> <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider> <class>model.Clan</class> <class>model.Kategorija</class> <class>model.Knjiga</class> <class>model.Primerak</class> <properties> <!-- 数据库连接配置 --> <property name="hibernate.connection.driver_class" value="com.mysql.cj.jdbc.Driver"/> <property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/library_db?useSSL=false&serverTimezone=UTC"/> <property name="hibernate.connection.username" value="root"/> <property name="hibernate.connection.password" value="123456"/> <!-- Hibernate核心配置 --> <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL8Dialect"/> <property name="hibernate.show_sql" value="true"/> <property name="hibernate.hbm2ddl.auto" value="update"/> </properties> </persistence-unit> </persistence>
内容的提问来源于stack exchange,提问作者nemanjagajic
相关产品推荐
相关产品推荐

