已在build.gradle引入Hibernate依赖却无法解析HibernatePersistenceProvider
根据你提供的错误日志、配置文件和依赖信息,我帮你梳理几个关键修复点:
1. 修正persistence.xml中持久化提供者类名的空格问题
这是最直接的问题——你的<provider>标签里类名前后有多余空格,会导致JPA无法正确识别类路径:
<!-- 错误写法:类名前后存在空格 --> <provider> org.hibernate.jpa.HibernatePersistenceProvider </provider> <!-- 正确写法:去掉前后空格 --> <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
2. 验证Hibernate版本与类名的匹配性
你使用的hibernate-core:5.0.5.Final版本中,org.hibernate.jpa.HibernatePersistenceProvider是有效的持久化提供者类,所以只要修正空格问题,类名就能被正确解析。如果后续升级到Hibernate 5.3+版本,这个类会被标记为过时,那时可以替换为org.hibernate.persistence.provider.HibernatePersistenceProvider,当前版本无需调整。
3. 确保Gradle依赖正确同步到IntelliJ
IntelliJ提示无法解析HibernatePersistenceProvider,大概率是依赖未正确导入或同步:
- 点击IntelliJ右侧Gradle面板的刷新按钮(🔄),重新同步项目依赖;
- 或者在终端执行命令强制刷新依赖并重新构建:
./gradlew clean build --refresh-dependencies
4. 确认persistence.xml的位置与打包路径
你把persistence.xml放在src/main/resources/META-INF是JPA的标准配置位置,Java插件默认会将该目录下的文件打包到build/classes/main/META-INF中。可以检查构建后的目录是否存在该文件,确保配置文件被正确加载到类路径。
附:你的错误日志
Task :JPABootstrapping.main() FAILED
Exception in thread "main" javax.persistence.PersistenceException: No Persistence provider for EntityManager named recipes
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:61)
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:39)
at setup.JPABootstrapping.main(JPABootstrapping.java:10)
Execution failed for task ':JPABootstrapping.main()'.Process 'command '/usr/lib/jvm/java-14-openjdk-amd64/bin/java'' finished with non-zero exit value 1
修正后的persistence.xml示例
<persistence> <persistence-unit name="recipes"> <description>Hibernate Tips</description> <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider> <exclude-unlisted-classes>false</exclude-unlisted-classes> <properties> <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQL81Dialect" /> <property name="javax.persistence.jdbc.driver" value="org.postgresql.Driver" /> <property name="javax.persistence.jdbc.url" value="jdbc:postgresql://192.168.122.242:5432/recipes" /> <property name="javax.persistence.jdbc.user" value="postgres" /> <property name="javax.persistence.jdbc.password" value="postgres" /> </properties> </persistence-unit> </persistence>
内容的提问来源于stack exchange,提问作者lainatnavi

