Решение: не найден поставщик Persistence для EntityManager
Быстрый ответ
Внимательно проверьте файл META-INF/persistence.xml
: здесь имя <persistence-unit>
должно совпадать с тем, которое вы используете в Persistence.createEntityManagerFactory()
.
Пример:
<persistence-unit name="YourUnitName">
<!-- Конфигурация -->
</persistence-unit>
Также проследите, чтобы реализация JPA, например, Hibernate, была включена в classpath. Если все компоненты на месте, EntityManager
будет работать исправно.
Проверьте jar-файлы и classpath
Убедитесь в присутствии Hibernate-core.jar
в classpath. Обычно в IDE, таких как Eclipse или IntelliJ, этот jar-файл располагается в /lib
. Для Maven убедитесь, что в файле pom.xml
корректно указана зависимость.
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.4.12.Final</version> <!-- Укажите актуальную версию -->
</dependency>
Приведите в порядок конфигурацию persistence
Тщательно проверьте файл persistence.xml
. Вам необходимо:
- Указать провайдера:
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
- Проверить данные подключения (URL, драйвер, имя пользователя, пароль)
- Проверить имя unit в
Persistence.createEntityManagerFactory("YourUnitName")
Откажитесь от устаревших компонентов
Нужно отказаться от использования org.hibernate.ejb.HibernatePersistence
в пользу HibernatePersistenceProvider
.
Соответственно, обновите также зависимости: замените hibernate-entitymanager
на hibernate-core
.
В Maven используйте актуальные версии зависимостей.
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>4.2.6.Final</version> <!-- Замените на актуальную версию -->
</dependency>
Рассмотрите альтернативные решения
Если проблема всё ещё остаётся нерешённой, проверьте:
- Может ли быть конфликт между другими настройками и конфигурацией persistence?
- Возможно, вы ошиблись при выборе поставщика persistence?
- Включены ли все необходимые зависимости для выбранного поставщика?
Визуализация
Схема работы EntityManager:
Поставщик persistence 🚂 ⇒ EntityManagerFactory ⇒ EntityManager ⇒ Данные
(например, Hibernate) (Двигатель) (Станция) (Поезд) (Пассажиры)
Отсутствие поставщика persistence можно сравнить с отсутствием двигателя, без которого поезд не сможет двигаться.
Правильно разместите блок persistence
Местоположение файла persistence.xml
имеет значение. В веб-приложениях он должен быть размещён в <webroot>/WEB-INF/classes/META-INF
.
Тщательно проверьте конфигурацию базы данных
Следует проверить:
- Соответствует ли JDBC URL.
- Соответствует ли класс JDBC драйвера используемой СУБД.
- Верны ли учётные данные для доступа к базе данных.
Малейшие ошибки могут стать причиной серьёзных проблем.
Укажите все необходимые зависимости
Ваш проект должен точно декларировать все зависимости. Maven и Gradle вам в этом помогут, но проверка файла сборки вручную также будет полезной.
Смело боритесь с конфликтами
Конфликты могут возникнуть на любом уровне конфигурации persistence. Анализируйте каждую деталь настроек, чтобы найти и устранить спрятанные проблемы.
Полезные материалы
- Eclipse error: "The import XXX cannot be resolved" – Stack Overflow — как решить проблемы с импортом в Eclipse.
- Part VIII: Persistence (Release 7) – Oracle Docs — официальное руководство по JPA от Oracle.
- Java persistence API – Tutorial – Vogella — подробное руководство по JPA для разработчиков на Java.
- Java Persistence/Setting the CLASSPATH – Wikibooks — как настроить CLASSPATH для Java Persistence.