Нет провайдера Persistence для EntityManager с именем X

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

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

  • Фрагмент моего кода, который вызывает 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:

Ответ 1

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

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

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

Вот подробности: (взято из спецификации JPA)

Файл persistence.xml определяет единицу постоянства. Файл persistence.xml находится в каталоге META-INF корня модуля постоянства.

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

Если вы не используете приложение Java EE

Файл или каталог jar, каталог META-INF которого содержит файл persistence.xml, называется корнем модуля постоянства.

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

В средах Java EE корень постоянства должен быть одним из следующих:

  • файл EJB-JAR
  • каталог WEB-INF/classes файла WAR [80]
  • файл jar в каталоге WEB-INF/lib файла WAR
  • файл JAR в каталоге библиотеки EAR
  • файл jar клиента приложения

Ответ 2

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

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

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

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

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

См. также ответы здесь: Нет провайдера устойчивости для EntityManager с именем

Ответ 3

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

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

Ответ 4

Итак, в моем случае все было в пути к классу, но мне пришлось добавить

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

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

Ответ 5

Если вы не хотите перемещать вашу папку 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>

Ответ 6

Не следует объяснять зависимость JPA

        <dependency>
                    <groupId>javax.persistence</groupId>
                    <artifactId>persistence-api</artifactId>
                    <version>1.0.2</version>    
      </dependency>

Спасибо,
Рахул