2013-10-11 3 views
12

Я разрабатываю приложение JavaSE с использованием JPA. К сожалению, я получаю null после вызова: Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);Отсутствует поставщик Persistence для EntityManager с именем X

Ниже вы найдете:

  • Фрагмент моего кода, который вызывает EntityManagerFactory и неожиданно возвращает null
  • Мой persistence.xml файл
  • Моя структура проекта

Отрывок из моего кода:

public class Main { 
    private static final String PERSISTENCE_UNIT_NAME = "MeineJpaPU"; 
    private static EntityManagerFactory factory; 

    public static void main(String[] args) { 
     // I get null on this line!!! 
     factory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME); 

     EntityManager em = factory.createEntityManager(); 
     // do stuff with entity manager 
     ... 
    } 
} 

Мой persistence.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<persistence version="1.0" 
    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"> 
    <persistence-unit name="MeineJpaPU" transaction-type="RESOURCE_LOCAL"> 
    <provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider> 
    <class>path.to.package.server.Todo</class> 
     <exclude-unlisted-classes>false</exclude-unlisted-classes> 
    <properties>  
      <property name="javax.persistence.jdbc.driver" value="org.postgresql.Driver"/>  
      <property name="javax.persistence.jdbc.url" value="jdbc:postgresql://localhost:5432/test"/>  
      <property name="javax.persistence.jdbc.user" value="postgres"/>  
      <property name="javax.persistence.jdbc.password" value="postgres"/>  
     </properties> 
    </persistence-unit> 
</persistence> 

Моя структура проекта:

This is the structure of my project:

ответ

13

Вы должны переместить persistence.xml файл в подходящее место.

Более конкретно, добавьте файл META-INF/persistence.xml в корень исходной папки.

В этом случае следующее соответствующее местоположение: src\main\java\META-INF\persistence.xml

Вот детали: (взяты из JPA спецификации)

A persistence.xml file defines a persistence unit. The persistence.xml file is 
located in the META-INF directory of the root of the persistence unit. 

Корень единицы сохранения является ключевым здесь.

Если вы приложение не-Java EE

The jar file or directory whose META-INF directory contains the persistence.xml 
file is termed the root of the persistence unit. 

Если вы находитесь в приложении Java EE, следующая действительны

In Java EE environments, the root of a persistence unit must be one of the following: 
• an EJB-JAR file 
• the WEB-INF/classes directory of a WAR file[80] 
• a jar file in the WEB-INF/lib directory of a WAR file 
• a jar file in the EAR library directory 
• an application client jar file 
11

Быстрого совет:

  • проверьте, сохраняется ли persistence.xml в вашем классеp ATH
  • проверить, если поставщик зимуют в вашем пути к классам

С помощью JPA в отдельное приложение (за пределами JavaEE), поставщик настойчивости должно быть указано где-то.Это можно сделать двумя способами, которые я знаю:

  • либо добавить элемент поставщика в блок сохранения: <provider>org.hibernate.ejb.HibernatePersistence</provider> (как описано в правильный ответ Крис здесь: https://stackoverflow.com/a/1285436/784594)
  • или поставщика для интерфейса javax.persistence .spi.PersistenceProvider должен быть указан в качестве службы, смотрите здесь: http://docs.oracle.com/javase/6/docs/api/java/util/ServiceLoader.html (это обычно включается при включении спящего режима, или другую реализацию JPA, в вашем пути к классам

в моем случае, я узнал, что из-за мавена неправильная конфигурация, hiberna te-entitymanager.jar не был включен как зависимость, даже если это была временная зависимость другого модуля.

Смотрите также ответы здесь: No Persistence provider for EntityManager named

+2

зимуют-entitymanager.jar правильный ответ для меня тоже. –

0

Так что в моем случае все было в пути к классам, но я должен был добавить

класса с = Class.forName ("org.eclipse.persistence.jpa .PersistenceProvider ");

Я думаю, это заставило PersistenceProvider регистрироваться в классах javax. В прошлом мне приходилось делать что-то подобное для драйверов JDBC.

0

Если вы не хотите перемещать вашу папку META-INF (возможно, потому, что именно там была создана ваша среда IDE, и вы не хотите ее путать), и если вы используете Maven, вы можете указать Maven, где найдите META-INF, используя тег <resources>. См: http://maven.apache.org/plugins/maven-resources-plugin/examples/resource-directory.html

В вашем случае:

<build> 
    <resources> 
    <resource> 
     <directory>src</directory> 
    </resource> 
    </resources> 
</build> 
1

Я недавно модернизировал NB 8.1 до 8.2, и вдруг столкнулись с этой проблемой и провел 2 дня ломать голову, чтобы решить. До 8.1, удалялся процессорный путь (упомянутый выше другими). С 8.2 проблема продолжалась.

Наконец, я обнаружил, что в библиотеке по умолчанию EclipseLink (JPA 2.1) отсутствует eclipselink.jar. Я добавил файл к определению библиотеки и вуаля - он начал работать!

0

Не дайте JPA DEPENDENCY

в явной форме
 <dependency> 
        <groupId>javax.persistence</groupId> 
        <artifactId>persistence-api</artifactId> 
        <version>1.0.2</version>  
     </dependency> 

Спасибо,
Rahul

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