27

I'm trying to set up a simple jpa 2.0 project by following the information in the Hibernate EntityManager documentation. I've been on this for hours now, but no matter what I do I always get this exception when I try to create a EntityManagerFactory:

Exception in thread "main" javax.persistence.PersistenceException: No Persistence provider for EntityManager named manager1
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:54)
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:32)
    at se.mycomp.UserTest.main(UserTest.java:9)

I've found quite a few similar questions regarding this exception, but no solutions that I am able to get to work. What am I doing wrong here?

directory structure

.
├── pom.xml
└── src
    ├── main
    │   ├── java
    │   │   └── se
    │   │       └── mycomp
    │   │           ├── UserTest.java
    │   │           └── domain
    │   │               └── User.java
    │   └── resources
    │       ├── META-INF
    │       │   └── persistence.xml
    │       └── log4j.properties
    └── test
        └── java

my persistence.xml

<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="manager1" transaction-type="RESOURCE_LOCAL">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <class>se.mycomp.domain.User</class> 
        <properties>
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect"/>
            <property name="hibernate.hbm2ddl.auto" value="create-drop"/>

            <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
            <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost/test"/>
            <property name="javax.persistence.jdbc.user" value="test"/>
            <property name="javax.persistence.jdbc.password" value="1234"/>
        </properties>
    </persistence-unit>
</persistence>

my 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>se.lil.tryjpa</groupId>
<artifactId>try-jpa</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

    <hibernate-core.version>3.6.4.Final</hibernate-core.version>
    <mysql-connector-java.version>5.1.16</mysql-connector-java.version>
    <slf4j.version>1.6.1</slf4j.version>
    <log4j.version>1.6.1</log4j.version>
</properties>

<dependencies>
    <!-- HIBERNATE DEPENDENCIES -->
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>${hibernate-core.version}</version>
    </dependency>

    <!-- MYSQL DEPENDENCIES -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>${mysql-connector-java.version}</version>
    </dependency>

    <!-- Logging Dependencies -->
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>${slf4j.version}</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>${log4j.version}</version>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>2.3.2</version>
            <configuration>
                <source>1.6</source>
                <target>1.6</target>
                <optimize>true</optimize>
                <debug>true</debug>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-eclipse-plugin</artifactId>
            <version>2.8</version>
            <configuration>
                <downloadSources>true</downloadSources>
            </configuration>
        </plugin>
    </plugins>
</build>

UserTest.java

public class UserTest {
    public static void main(String[] args) {
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("manager1");
        EntityManager em = emf.createEntityManager();
    }
}
Betlista
  • 10,327
  • 13
  • 69
  • 110
Holm
  • 982
  • 2
  • 12
  • 20

3 Answers3

47

Maybe you miss the Provider class or one of its dependencies in your pom.xml dependencies?

The link you give to the hibernate docs says that you should also add

<project ...>
  ...
  <dependencies>
    <dependency>
      <groupId>org.hibernate</groupId>
      <artifactId>hibernate-entitymanager</artifactId>
      <version>${hibernate-core-version}</version>
    </dependency>
  </dependencies>
</project>

to your pom.xml

Shyam Bhimani
  • 1,310
  • 1
  • 22
  • 37
Henk de Vries
  • 748
  • 7
  • 8
  • 4
    Not embarrassing at all, that error message is singularly useless (applies to a whole host of issues). – Martijn Verburg Jun 19 '13 at 17:56
  • 5
    I'd like to add that this dependency should replace the `hibernate-core` one, not just be added alongside, because it in fact already includes `hibernate-core`. See the list of Maven dependencies on Hibernate [downloads page](http://hibernate.org/orm/downloads/). They explicitly say that `for JPA, use hibernate-entitymanager instead of hibernate-core`. – jFrenetic Oct 22 '15 at 20:23
  • I was not using maven, so solved this by adding the hibernate-entity-manager.jar ( found in the dist\lib\optional\jpa directory in hibernate 5.5.2 zip ), and then by downloading and adding jta-1.1.jar – Gonen I Apr 08 '16 at 14:58
  • 1
    `hibernate-entitymanager` is now integrated into `hibernate-core` – AnnetteC Feb 15 '22 at 10:51
2

persistence.xml is meant to be present in META-INF directory and META-INF is meant to be present in the classpath of the application which is src folder.

As per your folder structure its present in resource folder, try moving it to classpath it sholud work.

Buhake Sindi
  • 87,898
  • 29
  • 167
  • 228
Ketan
  • 439
  • 4
  • 5
0

I got this problem solved using the dependencies below and the following provider:

<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>


 <dependency>
    <groupId>org.postgresql</groupId>
    <artifactId>postgresql</artifactId>
    <version>9.4-1200-jdbc41</version>
</dependency>
<dependency>
    <groupId>org.hibernate.javax.persistence</groupId>
    <artifactId>hibernate-jpa-2.0-api</artifactId>
    <version>LATEST</version>
</dependency>
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-entitymanager</artifactId>
    <version>LATEST</version>
</dependency>

is LATEST doesn't work as Version for you, you can use 1.0.1.Final for hibernate-jpa-2.0-api and 5.2.5.Final for hibernate-entitymanager

Also, in persistence.xml, don't forget hbm2dll.auto properties (this was one issue I've spent some time figuring out)

<property name="hibernate.hbm2ddl.auto" value="create"/>
<property name="hibernate.show_sql" value="true"/>

Then make a maven clean install

moldovean
  • 3,132
  • 33
  • 36