Не указан поставщик сохраняемости для EntityManager
У меня есть мой persistence.xml с тем же именем, используя toplink, в каталоге META-INF. Тогда у меня есть код, который вызывает его с:
EntityManagerFactory emfdb = Persistence.createEntityManagerFactory("agisdb");
Тем не менее, я получил следующее сообщение об ошибке
2009-07-21 09:22:41,018 [main] ОШИБКА - Отсутствует поставщик сохраняемости для EntityManager с именем agisdb javax.persistence.PersistenceException: нет поставщика сохраняемости для EntityManager с именем agisdb в javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:89) в 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>
Это должно было быть в classpath. Тем не менее, я получил вышеуказанную ошибку.
33 ответа
После <persistence-unit name="agisdb">
Определите имя поставщика постоянства:
<provider>org.hibernate.ejb.HibernatePersistence</provider>
Положить "hibernate-entitymanager.jar"
в пути к классу приложения.
Для более новых версий вы должны использовать "hibernate-core.jar"
вместо устаревшего hibernate-entitymanager
Если вы работаете через какую-то IDE, например, Eclipse: Project Properties -> Java Build Path -> Libraries.
В противном случае положить его в /lib
вашего приложения.
Убедитесь, что persistence.xml
файл находится в каталоге: <webroot>/WEB-INF/classes/META-INF
Столкнулся с той же проблемой и не мог найти решение в течение достаточно долгого времени. В моем случае это помогло заменить
<provider>org.hibernate.ejb.HibernatePersistence</provider>
с
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
Взял решение отсюда
Мне нужно это в моем файле pom.xml:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>4.2.6.Final</version>
</dependency>
Есть еще один момент: если вы столкнулись с этой проблемой в среде Eclipse RCP, вам, возможно, придется изменить поколение Factory с Persistence.createEntityManagerFactory
в new PersistenceProvider().createEntityManagerFactory
см. ECF для подробного обсуждения этого.
Может быть, вы определили одного провайдера как <provider>org.hibernate.ejb.HibernatePersistence</provider>
но ссылка на другую в банке. Это случилось со мной: мой поставщик persistence.xml был openjpa, но я использовал eclipselink в моем classpath. Надеюсь, это поможет!
Быстрый совет:
- проверьте, есть ли файл persistence.xml в вашем пути к классам
- проверьте, есть ли провайдер спящего режима в вашем classpath
При использовании JPA в автономном приложении (за пределами JavaEE) где-то должен быть указан поставщик постоянства. Это можно сделать двумя способами, которые я знаю:
- либо добавьте элемент провайдера в модуль постоянства:
<provider>org.hibernate.ejb.HibernatePersistence</provider>
(как описано в правильном ответе Криса: /questions/20761700/ne-ukazan-postavschik-sohranyaemosti-dlya-entitymanager/20761713#20761713) - или провайдер для интерфейса javax.persistence.spi.PersistenceProvider должен быть указан как сервис, см. здесь: http://docs.oracle.com/javase/6/docs/api/java/util/ServiceLoader.html (обычно это включается, когда вы включаете hibernate или другую реализацию JPA в ваш путь к классам
В моем случае я обнаружил, что из-за неправильной конфигурации maven jar hibernate-entitymanager не был включен в качестве зависимости, даже если это была временная зависимость другого модуля.
Я несколько лет опаздываю на вечеринку, но я столкнулся с тем же исключением, пытаясь заставить Hibernate 3.5.1 работать с HSQLDB и настольной программой JavaFX. Я получил его на работу с помощью этой темы и много проб и ошибок. Кажется, вы получаете эту ошибку для целого ряда проблем:
No Persistence provider for EntityManager named mick
Я пытался создать примеры учебников по гибернации, но поскольку я использовал Java 10, я не смог заставить их легко создавать и запускать. Я отказался от этого, не очень желая тратить время на решение своих проблем. Настройка файла module-info.java (Jigsaw) - это еще одна новинка, которую многие люди еще не обнаружили.
Несколько сбивает с толку то, что эти (ниже) были единственными двумя файлами, которые мне были нужны в моем файле build.gradle. В документации Hibernate не совсем ясно, какие именно Jar-файлы вам нужно включить. Entity-manager вызывал путаницу и больше не требуется в последней версии Hibernate, также как и javax.persistence-api. Обратите внимание, что я использую Java 10 здесь, поэтому мне пришлось включить jaxb-api, чтобы обойти некоторые ошибки xml-bind, а также добавить запись для модуля постоянства java в мой файл module-info.java.
build.gradle
// https://mvnrepository.com/artifact/org.hibernate/hibernate-core
compile('org.hibernate:hibernate-core:5.3.1.Final')
// https://mvnrepository.com/artifact/javax.xml.bind/jaxb-api
compile group: 'javax.xml.bind', name: 'jaxb-api', version: '2.3.0'
Module-info.java
// Used for HsqlDB - add the hibernate-core jar to build.gradle too
requires java.persistence;
В hibernate 5.3.1 вам не нужно указывать провайдера ниже в вашем файле persistence.xml. Если он не указан, по умолчанию выбирается поставщик Hibernate.
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
Файл persistence.xml должен находиться в правильном каталоге, поэтому:
src/main/resources/META-INF/persistence.xml
Проход по исходному коду гибернации в отладчике Intellij, где он проверяет диалект, также вызывал точно такое же исключение из-за отсутствия свойства диалекта в файле persistence.xml. Я добавил это (добавьте правильный для вашего типа БД):
<property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/>
После этого я по-прежнему получал то же исключение, поэтому при повторном выполнении отладчика в Intellij у тестовой сущности, которую я пытался сохранить (простой пример родитель-потомок), отсутствовали аннотации для отношений OneToMany, ManyToOne. Я исправил это, и исключение ушло, и мои сущности сохранились в порядке.
Вот мой полный финальный файл persistence.xml:
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence
http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"
version="2.1">
<persistence-unit name="mick" transaction-type="RESOURCE_LOCAL">
<description>
Persistence unit for the JPA tutorial of the Hibernate Getting Started Guide
</description>
<!-- Provided in latest release of hibernate
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
-->
<class>com.micks.scenebuilderdemo.database.Parent</class>
<class>com.micks.scenebuilderdemo.database.Child</class>
<properties>
<property name="javax.persistence.jdbc.driver" value="org.hsqldb.jdbc.JDBCDriver"/>
<property name="javax.persistence.jdbc.url"
value="jdbc:hsqldb:file:./database/database;DB_CLOSE_DELAY=-1;MVCC=TRUE"/>
<property name="javax.persistence.jdbc.user" value="sa"/>
<property name="javax.persistence.jdbc.password" value=""/>
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.hbm2ddl.auto" value="create"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/>
</properties>
</persistence-unit>
</persistence>
Я, вероятно, потратил около половины дня на этот драгоценный камень. Я бы посоветовал начать очень просто - с одного тестового объекта с одним или двумя полями, так как кажется, что это исключение может иметь много причин.
Если вы используете Eclipse, убедитесь, что шаблон исключения не удаляет ваши persistence.xml
из исходных папок на пути сборки.
- Перейдите в Свойства -> Путь сборки Java -> Вкладка Источник
- Проверьте ваш шаблон исключения, который расположен на
MyProject/src/main/java -> Excluded: <your_pattern>
узел дерева - При желании установите его на
Excluded: (None)
выбрав узел и нажав кнопку Edit... слева.
Угловой случай: если вы используете m2Eclipse, он автоматически вставляет исключения в ваши папки ресурсов. Затем, когда вы попытаетесь запустить тесты внутри eclipse, последующее отсутствие файла persistence.xml приведет к этой ошибке.
Убедитесь, что вы создали файл persistence.xml в папке 'src'. Я создал в папке проекта, и это была моя проблема.
Если вы используете Maven, возможно, он не ищет нужное место для папки META-INF. Другие упоминали о копировании папки, но другой способ, который мне помог, состоял в том, чтобы сообщить Maven, где его искать, используя <resources>
тег. Смотрите: http://maven.apache.org/plugins/maven-resources-plugin/examples/resource-directory.html
В моем случае ранее я использовал идею для создания сущности по схеме базы данных, а persistence.xml
автоматически создается в src/main/java/META-INF
и, согласно /questions/45141378/maveneclipse-ne-udalos-najti-fajl-meta-infpersistencexml-v-puti-k-klassam/45141391#45141391, я перемещаю его вsrc/main/resources/META-INF
, также пометил META-INF как корень источника. Меня устраивает.
Но просто пометить исходный META-INF(то есть src/main/java/META-INF) как исходный корень не работает, что меня смущает.
У меня также была эта ошибка, но проблема заключалась в том, что пространство имен URI в persistence.xml
,
Я заменил http://xmlns.jcp.org/xml/ns/persistence
в http://java.sun.com/xml/ns/persistence
и версия 2.1 до 2.0.
Это сейчас работает.
Это происходит, когда менеджер сущностей пытается указать на множество постоянных единиц. Сделайте следующие шаги:
- откройте соответствующий файл в вашем редакторе (если ваш проект был закрыт в вашей IDE)
- удалить весь код персистентности и менеджера сущностей
- сохранить файл
- откройте проект в вашей IDE
- теперь свяжите БД или таблицу по вашему выбору
Я столкнулся с той же проблемой, но на EclipseLink версии 2.5.0.
Я решил свою проблему, добавив еще один файл jar, который был обязательно (javax.persistence_2.1.0.v201304241213.jar.jar);
Баночки нужны:
- javax.persistence_2.1.0.v201304241213.jar
- eclipselink.jar
- jdbc.jar (в зависимости от используемой базы данных).
Надеюсь, это поможет.
Вам нужно добавить hibernate-entitymanager-x.jar в путь к классам.
В Hibernate 4.x, если jar присутствует, нет необходимости добавлять org.hibernate.ejb.HibernatePersistence в файле persistence.xml.
На вопрос уже дан ответ, но я просто хотел опубликовать отзыв, который меня поддерживал. Это исключение выдается после предыдущих ошибок. Я получил это:
property toplink.platform.class.name is deprecated, property toplink.target-database should be used instead.
Хотя я изменил файл persistence.xml, добавив новое имя свойства:
<property name="toplink.target-database" value="oracle.toplink.platform.database.oracle.Oracle10Platform"/>
После сообщения об устаревшем имени свойства я получил то же исключение PersistenceException, что и выше, и целую строку исключений. Мой совет: обязательно проверьте начало колбасы исключения.
Кажется, в Glassfish v2.1.1 есть ошибка, когда повторные развертывания или отмены развертывания и развертывания не обновляют файл persistence.xml, который где-то кэшируется. Я должен был перезагрузить сервер, и тогда это работало.
В OSGi-контексте необходимо перечислить ваши единицы персистентности в файле MANIFEST.MF пакета, например
JPA-PersistenceUnits: my-persistence-unit
В противном случае JPA-пакет не будет знать, что ваш пакет содержит единицы сохраняемости.
См. http://wiki.eclipse.org/EclipseLink/Examples/OSGi/Developing_with_EclipseLink_OSGi_in_PDE.
Я уже настроил файл persistence.xml и установил все зависимости Hibernate, но все еще столкнулся с этой ошибкой.
В моем случае я импортировал неправильныйPersistence
сорт.
я заменил
import javax.persistence.Persistence
с
import jakarta.persistence.Persistence
Это решило проблему. Хотелось бы, чтобы сообщение об ошибке было более информативным или полезным, но вот оно.
Вам нужны следующие jar-файлы в classpath:
- ANTLR-2.7.6.jar
- Викисклад коллекция-3.1.jar
- dom4j-1.6.1.jar
- спящая-Викисклад аннотации-4.0.1.Final.jar
- Зимуют-ядро-4.0.1.Final.jar
- Зимуют-entitymanager.jar
- спящий режим JPA-2,0-апи-1.0.0.Final.jar-
- Javassist-3.9.0.jar
- JBoss-каротаж 3.1.1.GA.jar
- JTA-1.1.jar
- SLF4J-апи-1.5.8.jar
- ххх-driver.jar-JDBC
Hibernate 5.2.5
Jar-файлы, необходимые в пути к классу. Это находится в требуемой папке Hibernate 5.2.5 Final Release. Его можно скачать с http://hibernate.org/orm/downloads/
- ANTLR-2.7.7
- КДИ-апи-1,1
- одноклассник-1.3.0
- dom4j-1.6.1
- эль-апи-2,2
- Джеронимо-jta_1.1_spec-1.1.1
- hibernate-commons-annotation-5.0.1.Final
- hibernate-core-5.2.5.Final
- hibernate-jpa-2.1-api-1.0.0.Final
- jandex-2.0.3.Final
- Javassist-3.20.0-GA
- javax.inject-1
- JBoss-перехватчик-api_1.1_spec-1.0.0.Beta1
- jboss-logging-3.3.0.Final
- jsr250-апи-1,0
Создайте XML-файл "persistence.xml" в
YourProject/ SRC / META-INF / persistence.xml
persistence.xml
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence
http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"
version="2.1">
<persistence-unit name="sample">
<class>org.pramod.data.object.UserDetail</class>
<exclude-unlisted-classes>true</exclude-unlisted-classes>
<properties>
<property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
<property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/hibernate_project"/>
<property name="hibernate.connection.username" value="root"/>
<property name="hibernate.connection.password" value="root"/>
<property name="hibernate.hbm2ddl.auto" value="create-drop"/>
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.format_sql" value="false"/>
<property name="hibernate.cache.use_second_level_cache" value="false"/>
<property name="hibernate.archive.autodetection" value="true"/>
</properties>
</persistence-unit>
- запишите информацию, указанную в теге
, и версия должна быть 2.1. - обратите внимание на тег name
, имя упоминается как "образец". Это имя должно использоваться точно так же, когда вы загружаете
EntityManagerFactor = Persistance.createEntityManagerFactory("образец");, "образец" может быть изменен в соответствии с вашим соглашением об именах.
Теперь создайте класс Entity. с именем согласно моему примеру UserDetail, в пакете org.pramod.data.object
UserDetail.java
package org.pramod.data.object;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name = "user_detail")
public class UserDetail {
@Id
@Column(name="user_id")
private int id;
@Column(name="user_name")
private String userName;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
@Override
public String toString() {
return "UserDetail [id=" + id + ", userName=" + userName + "]";
}
}
Теперь создайте класс с методом main.
HibernateTest.java
package org.pramod.hibernate;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import org.pramod.data.object.UserDetail;
public class HibernateTest {
private static EntityManagerFactory entityManagerFactory;
public static void main(String[] args) {
UserDetail user = new UserDetail();
user.setId(1);
user.setUserName("Pramod Sharma");
try {
entityManagerFactory = Persistence.createEntityManagerFactory("sample");
EntityManager entityManager = entityManagerFactory.createEntityManager();
entityManager.getTransaction().begin();
entityManager.persist( user );
entityManager.getTransaction().commit();
System.out.println("successfull");
entityManager.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
Выход будет
UserDetail [id=1, userName=Pramod Sharma]
Hibernate: drop table if exists user_details
Hibernate: create table user_details (user_id integer not null, user_name varchar(255), primary key (user_id))
Hibernate: insert into user_details (user_name, user_id) values (?, ?)
successfull
Попробуйте также вручную скопировать файл persistence.xml в папку <project root>\bin\META-INF
. Это устранило проблему в Eclipse Neon сEclipseLink 2.5.2
используя простой плагин-проект.
В моем случае речь шла об ошибке в двух свойствах, как показано ниже. Когда я их изменил, "Отсутствует поставщик сохраняемости для EntityManager с именем" исчез.
Таким образом, вы можете попробовать проверить соединение со своими свойствами, чтобы проверить, все ли правильно.
<property name="javax.persistence.jdbc.url" value="...”/>
<property name="javax.persistence.jdbc.password" value="...”/>
Странная ошибка, я из-за этого был полностью сбит с толку.
Если есть разные имена в Persistence.createEntityManagerFactory("JPAService")
в разных классах, чем вы получаете ошибку. Путем рефакторинга можно получить разные имена, что было в моем случае. В одном классе сгенерированный автоматически Persistence.createEntityManagerFactory("JPAService")
в private void initComponents()
, Класс ContactsTable отличается от Persistence.createEntityManagerFactory("JPAServiceExtended")
в классе DBManager.
Была такая же проблема, но это сработало для меня:
mvn install -e -Dmaven.repo.local=$WORKSPACE/.repository.
NB. Приведенная выше команда maven переустановит все зависимости вашего проекта с нуля. Ваша консоль будет загружена подробными журналами из-за того, что maven делает сетевой запрос.
Моя проблема была решена путем добавления информации в persistence.xml, например <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
а затем убедитесь, что у вас есть библиотека на classpath, например, в Maven добавить зависимость, как
<dependency>
<groupId>org.eclipse.persistence</groupId>
<artifactId>eclipselink</artifactId>
<version>2.5.0</version>
</dependency>
Проверьте постоянное имя устройства
<persistence-unit name="com.myapp.model.jpa"
transaction-type="RESOURCE_LOCAL">
public static final String PERSISTENCE_UNIT_NAME = "com.myapp.model.jpa";
Persistence.createEntityManagerFactory(**PERSISTENCE_UNIT_NAME**);