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.

Share:
32,794
Andrea
Author by

Andrea

Updated on November 28, 2020

Comments

  • Andrea
    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
    Gimby over 9 years
    I think you mean src/main/resources
  • JCvanDamme
    JCvanDamme over 7 years
    in 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
    JohnK over 6 years
    This 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
    Sridhar Sarnobat about 6 years
    My META-INF is in src/main/webapps. If I move it to resources, it tells me Unable to locate persistence units. It seems that this is progress.