Нет провайдера 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) поставщик сохранения необходимо где-то указать. Это можно сделать двумя способами, о которых я знаю:
В моем случае я узнал, что из-за неправильной конфигурации 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>
Спасибо,
Рахул