2010-11-23 3 views
5

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

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> 

Что делать неправильно? Спасибо заранее.

ответ

7

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

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

Вам не кажется, есть зависимость для фактического Peristence поставщика.

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

0

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

Мое предположение (я признаю) заключается в том, что API-интерфейс persistence API не находит TopLink (поставщик непрерывности) в пути к классам. Попробуйте добавить TopLink в зависимость.

2

если вы используете 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> 
2

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

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

+0

Спасибо, что поставили вторую точку. Это была проблема, которую я имел. Благодаря!!! – nashuald 2013-03-25 14:53:29

0

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

Смежные вопросы