Не указан поставщик сохраняемости для EntityManager - PullRequest
138 голосов
/ 21 июля 2009

У меня есть мой persistence.xml с тем же именем, используя toplink, в каталоге META-INF. Тогда у меня есть код, вызывающий его с помощью:

EntityManagerFactory emfdb = Persistence.createEntityManagerFactory("agisdb");

Тем не менее, я получил следующее сообщение об ошибке

2009-07-21 09:22:41,018 [main] ERROR - No Persistence provider for EntityManager named agisdb
javax.persistence.PersistenceException: No Persistence provider for EntityManager named agisdb
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:89)
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:60)

Вот файл persistence.xml:

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="1.0">
    <persistence-unit name="agisdb">
        <class>com.agis.livedb.domain.AddressEntity</class>
        <class>com.agis.livedb.domain.TrafficCameraEntity</class>
        <class>com.agis.livedb.domain.TrafficPhotoEntity</class>
        <class>com.agis.livedb.domain.TrafficReportEntity</class>
        <properties>
            <property name="toplink.jdbc.url" value="jdbc:mysql://localhost:3306/agisdb"/>
            <property name="toplink.jdbc.driver" value="com.mysql.jdbc.Driver"/>
            <property name="toplink.jdbc.user" value="root"/>
            <property name="toplink.jdbc.password" value="password"/>
        </properties>
    </persistence-unit>
</persistence>

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

Ответы [ 25 ]

86 голосов
/ 25 февраля 2011

Поместите "hibernate-entitymanager.jar" в путь к классу приложения.
Для более новых версий вы должны использовать "hibernate-core.jar" вместо устаревшего hibernate-entitymanager

Если вы работаете через какую-то IDE, например Eclipse : Project Properties -> Java Build Path -> Libraries.

В противном случае укажите его в /lib вашего приложения.

84 голосов
/ 17 августа 2009

После <persistence-unit name="agisdb"> определите имя поставщика постоянства:

<provider>org.hibernate.ejb.HibernatePersistence</provider>
66 голосов
/ 06 декабря 2009

Убедитесь, что файл persistence.xml находится в каталоге: <webroot>/WEB-INF/classes/META-INF

17 голосов
/ 20 октября 2013

Мне нужно это в моем файле pom.xml:

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-entitymanager</artifactId>
    <version>4.2.6.Final</version>
</dependency>
15 голосов
/ 13 апреля 2017

Столкнулся с той же проблемой и не мог найти решение в течение достаточно долгого времени. В моем случае это помогло заменить

<provider>org.hibernate.ejb.HibernatePersistence</provider>

с

<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>

Взял решение от здесь

9 голосов
/ 14 мая 2010

Возможно, вы определили одного провайдера как <provider>org.hibernate.ejb.HibernatePersistence</provider>, но ссылаетесь на другого в jar. Это случилось со мной: мой поставщик persistence.xml был openjpa, но я использовал eclipselink в моем classpath. Надеюсь, что это поможет!

9 голосов
/ 24 августа 2011

Есть еще один момент: если вы столкнулись с этой проблемой в среде Eclipse RCP, вам, возможно, придется изменить поколение Factory с Persistence.createEntityManagerFactory на new PersistenceProvider().createEntityManagerFactory

см. ECF для подробного обсуждения этого вопроса.

7 голосов
/ 06 марта 2014

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

  • проверьте, есть ли файл persistence.xml в вашем пути к классам
  • проверить, есть ли провайдер спящего режима в вашем классе

При использовании 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 (обычно это включается, когда вы включаете hibernate или другую реализацию JPA в ваш путь к классу

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

5 голосов
/ 06 сентября 2013

Если вы используете Eclipse, убедитесь, что шаблон исключения не удаляет ваши persistence.xml из исходных папок на пути сборки.

  1. Перейти к Свойства -> Путь сборки Java -> Источник вкладка
  2. Проверьте ваш шаблон исключения, который расположен в
    MyProject/src/main/java -> Excluded: <your_pattern>
    узел дерева
  3. При желании установите его на Excluded: (None), выбрав узел и нажав кнопку Изменить ... слева.
4 голосов
/ 25 июня 2010

Угловой случай: если вы используете m2Eclipse, он автоматически вставляет исключения в ваши папки ресурсов. Затем, когда вы попытаетесь запустить тесты внутри затмения, последующее отсутствие файла persistence.xml приведет к этой ошибке.

...