Ошибка «Нет поставщика сохраняемости для EntityManager» - PullRequest
5 голосов
/ 24 ноября 2010

Я новичок в JPA, и я попытался сделать простой пример из книги. Но что бы я ни делал, я получаю следующую ошибку:

Exception in thread "main" javax.persistence.PersistenceException: No Persistence provider for EntityManager named EmployeeService
        at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:89)
        at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:60)
        at com.mycompany.simpleentity.EmployeeTest.main(EmployeeTest.java:18)

Я много гуглил и делал все, что читал о JPA.
Вот дерево каталогов моего проекта:

    .
|-- pom.xml
`-- src
    |-- main
    |   |-- java
    |   |   `-- com
    |   |       `-- mycompany
    |   |           `-- simpleentity
    |   |               |-- Employee.java
    |   |               |-- EmployeeService.java
    |   |               `-- EmployeeTest.java
    |   `-- resources
    |       `-- META-INF
    |           `-- persistence.xml
    `-- test

Вот мой 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/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.mycompany</groupId>
  <artifactId>SimpleEntity</artifactId>
  <packaging>jar</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>SimpleEntity</name>
  <url>http://maven.apache.org</url>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>javax.persistence</groupId>
      <artifactId>persistence-api</artifactId>
      <version>1.0</version>      
    </dependency>
    <dependency>
        <groupId>postgresql</groupId>
        <artifactId>postgresql</artifactId>
        <version>9.0-801.jdbc4</version>
    </dependency>
  </dependencies>

  <build>

      <plugins>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-compiler-plugin</artifactId>
          <configuration>
             <source>1.5</source>
             <target>1.5</target>
          </configuration>
        </plugin>

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>

            <configuration>
                <archive>
                    <manifest>
                        <addClasspath>true</addClasspath>
                        <mainClass>com.mycompany.simpleentity.EmployeeTest</mainClass>
                        <!-- <classpathLayoutType>repository</classpathLayoutType> -->
                        <classpathMavenRepositoryLayout>true</classpathMavenRepositoryLayout>
                        <classpathPrefix>${env.HOME}/.m2/repository</classpathPrefix>

                    </manifest>
                </archive>
            </configuration>
        </plugin>
      </plugins>

  </build> 
</project>

Вот мой исходный код: EmployeeTest.java:

package com.mycompany.simpleentity;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

public class EmployeeTest {
    public static void main(String[] args) {
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("EmployeeService");
        EntityManager em = emf.createEntityManager();

    }
}

А вот и мой persistance.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_1_0.xsd"
        version="1.0">

    <persistence-unit name="EmployeeService" transaction-type="RESOURCE_LOCAL">
        <class>com.mycompany.simpleentity.Employee</class>
        <properties>
            <property name="toplink.jdbc.driver"
                      value="org.postgresql.Driver"/>
            <property name="toplink.jdbc.url"
                      value="jdbc:postgresql://localhost:5432/testdb;create=true"/>
            <property name="toplink.jdbc.user" value="postgres"/>
            <property name="toplink.jdbc.password" value="111"/>

        </properties>
    </persistence-unit>
</persistence>

Что я делаю не так? Заранее спасибо.

Ответы [ 6 ]

7 голосов
/ 24 ноября 2010

JPA - это спецификация, реализованная несколькими поставщиками JPA (Hibernate, EclipseLink, OpenJPA, Toplink).

Вам необходимо выбрать поставщика и добавить соответствующую зависимость к вашему pom.xml.Также вам нужно указать вашего провайдера в persistence.xml.

Например, если вы используете OpenJPA (я выбрал его для этого примера, поскольку его последняя версия доступна в Maven Central Repo, поэтому нет необходимости настраиватьрепозитории конкретных поставщиков):

 <dependencies> 
    <dependency> 
      <groupId>junit</groupId> 
      <artifactId>junit</artifactId> 
      <version>3.8.1</version> 
      <scope>test</scope> 
    </dependency> 
    <!-- Note that you don't need persistence-api dependency - it's transitive -->
    <dependency>
      <groupId>org.apache.openjpa</groupId>
      <artifactId>openjpa-all</artifactId>
      <version>2.0.1</version>
    </dependency>
    <dependency> 
        <groupId>postgresql</groupId> 
        <artifactId>postgresql</artifactId> 
        <version>9.0-801.jdbc4</version> 
    </dependency> 
  </dependencies> 

.

<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_1_0.xsd"       
        version="1.0">       

    <persistence-unit name="EmployeeService" transaction-type="RESOURCE_LOCAL">   
        <!-- Provider specification -->
        <provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>

        <class>com.mycompany.simpleentity.Employee</class>       
        <properties>       
            <property name="javax.persistence.jdbc.driver"       
                      value="org.postgresql.Driver"/>       
            <property name="javax.persistence.jdbc.url"       
                      value="jdbc:postgresql://localhost:5432/testdb;create=true"/>       
            <property name="javax.persistence.jdbc.user" value="postgres"/>       
            <property name="javax.persistence.jdbc.password" value="111"/>       

        </properties>       
    </persistence-unit>       
</persistence>  
2 голосов
/ 03 декабря 2012

1) убедитесь, что вы определили поставщика сохраняемости (для любого поставщика): Например, для openjpa: <persistence-unit ...> <provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider> ... ... </persistence-unit>

2) если вы используете пользовательский процесс сборки / компиляции (maven и т. Д.) убедитесь, что ваш Meta-INF / persistance.xml скопирован в папку скомпилированного / classes.

2 голосов
/ 14 сентября 2012

если вы используете JPA + Eclipselink Provider, чем использовать этот код

<properties>
            <property name="javax.persistence.jdbc.url" value="jdbc:postgresql://localhost/Database name" />
            <property name="javax.persistence.jdbc.user" value="" />
            <property name="javax.persistence.jdbc.password" value="" />
            <property name="javax.persistence.jdbc.driver" value="org.postgresql.Driver" />
</properties>
1 голос
/ 24 ноября 2010

На самом деле,

У вас, похоже, нет зависимости от фактического поставщика постоянства.

Сам по себе JPA не имеет реализации, вам также потребуется использовать Hibernate / Toplink / OpenJPA в качестве фактического решения.

0 голосов
/ 05 октября 2013

JPA, являющийся спецификацией, имеет несколько провайдеров (разработчиков).Вы должны выбрать тот, который предоставляет фактический байт-код для спецификации JPA.Hibernate - это обычный выбор, но ваш может отличаться.Как только вы определили это, добавьте это как зависимость в свой POM.В противном случае добавьте файл JAR в путь сборки.

0 голосов
/ 24 ноября 2010

В соответствии с вашим persistence.xml вы используете TopLink с PostgreSQL в качестве СУБД.Хотя вы ссылаетесь на драйвер JDBC PostgreSQL в вашем pom.xml, вы не объявили TopLink как зависимость.

Я предполагаю (я признаю), что API персистентности не находит TopLink (ваш поставщик персистенции)в пути к классам.Попробуйте добавить TopLink в качестве зависимости.

...