JPA + Hibernate = No Persistence provider for EntityManager
32,794
Solution 1
Persistence.xml is not in resources directory and therefore not in classpath. Move META-INF directory to src/main/resources.
Solution 2
Add hibernate-entitymanager.jar to the classpath to resolve this issue.
Author by
Andrea
Updated on November 28, 2020Comments
-
Andrea over 3 years
I'm trying to setup JPA for my Maven project, using Hibernate as provider.
Structure of the project
├── META-INF │ └── persistence.xml ├── src | ├── main | | └── java | | ├── model | | | └── Instance.java | | └── App.java | └── test | └── java | └── model | └── AppTest.java └── pom.xml
Content of persistence.xml
<?xml version="1.0" encoding="UTF-8"?> <persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence" version="2.1"> <persistence-unit name="testjpa" transaction-type="RESOURCE_LOCAL"> <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider> <class>it.vitrociset.model.Instance</class> <properties> <property name="hibernate.connection.url" value="jdbc:postgresql://localhost:5432/aquasystem"/> <property name="hibernate.connection.driver_class" value="org.postgresql.Driver"/> <property name="hibernate.connection.username" value="username"/> <property name="hibernate.connection.password" value="password"/> </properties> </persistence-unit> </persistence>
Content of Instance.java
package model; import javax.persistence.Entity; import javax.persistence.Id; @Entity public class Instance { @Id private String id; private String path; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getPath() { return path; } public void setPath(String path) { this.path = path; } }
Content of App.java
import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.EntityTransaction; import javax.persistence.Persistence; public class App { public static void main( String[] args ) { EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("testjpa"); EntityManager em = entityManagerFactory.createEntityManager(); EntityTransaction userTransaction = em.getTransaction(); userTransaction.begin(); Instance instance = new Instance(); instance.setId("id"); instance.setPath("path"); em.persist(instance); userTransaction.commit(); em.close(); entityManagerFactory.close(); } }
Content of pom.xml
<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 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId></groupId> <artifactId></artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>4.3.6.Final</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-entitymanager</artifactId> <version>4.3.6.Final</version> </dependency> <dependency> <groupId>org.hibernate.javax.persistence</groupId> <artifactId>hibernate-jpa-2.0-api</artifactId> <version>1.0.1.Final</version> </dependency> </dependencies> </project>
I got the following exception:
Exception in thread "main" javax.persistence.PersistenceException: No Persistence provider for EntityManager named testjpa
but I have no idea why. What is wrong in my code? I wasn't able to find the solution.
-
Gimby over 9 yearsI think you mean src/main/resources
-
JCvanDamme over 7 yearsin persistence.xml try using org.hibernate.jpa.HibernatePersistenceProvider as provider with Hibernate 5 instead of org.hibernate.ejb.HibernatePersistene which you are using with Hibernate 4
-
JohnK over 6 yearsThis solved my problem when I tried to back-port to Java 1.7. This is deprecated now, and hibernate-core is to be used instead. However, without this hibernate was unable to find my Persistence Provider .... ????
-
Sridhar Sarnobat about 6 yearsMy META-INF is in src/main/webapps. If I move it to
resources
, it tells meUnable to locate persistence units
. It seems that this is progress.