Нет провайдера 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:

    org.apache.openjpa.persistence.PersistenceProviderImpl path.to.package.server.Todo false         

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

Это структура моего проекта:

    Вы должны перенести файл 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 

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

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

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

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

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

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

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

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

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

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

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

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

    В твоем случае:

        src    

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

       javax.persistence persistence-api 1.0.2  

    Благодаря,
    Рахул

    Давайте будем гением компьютера.