9

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.

3 Answers 3

18

Persistence.xml is not in resources directory and therefore not in classpath. Move META-INF directory to src/main/resources.

Sign up to request clarification or add additional context in comments.

2 Comments

I think you mean src/main/resources
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.
5

Add hibernate-entitymanager.jar to the classpath to resolve this issue.

1 Comment

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 .... ????
1

I had this problem with hibernate 5. Switching to 4.3.11.Final fix it. The org.hibernate.ejb.HibernatePersistence wasn't in classpath.

1 Comment

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

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.