Ответ 1
После <persistence-unit name="agisdb">
определите имя поставщика сохранения:
<provider>org.hibernate.ejb.HibernatePersistence</provider>
У меня есть мой 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>
Это должно было быть в classpath. Тем не менее, я получил вышеуказанную ошибку.
После <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
Мне это нужно в моем файле pom.xml:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>4.2.6.Final</version>
</dependency>
Столкнулся с той же проблемой и долгое время не мог найти решение. В моем случае это помогло заменить
<provider>org.hibernate.ejb.HibernatePersistence</provider>
с
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
Взял решение из здесь
Возможно, вы определили одного поставщика, например <provider>org.hibernate.ejb.HibernatePersistence</provider>
, но ссылаетесь на другой в банке. Это произошло со мной: мой поставщик persistence.xml был openjpa, но я использовал eclipselink в своем пути к классам.
Надеюсь эта помощь!
Есть еще одна точка. Если вы столкнулись с этой проблемой в среде RCP Eclipse, вам может потребоваться изменить генерацию Factory с Persistence.createEntityManagerFactory
на new PersistenceProvider().createEntityManagerFactory
см. ECF для подробного обсуждения этого вопроса.
Быстрый совет:
При использовании JPA в автономном приложении (за пределами JavaEE) поставщик сохранения необходимо где-то указать. Это можно сделать двумя способами, о которых я знаю:
<provider>org.hibernate.ejb.HibernatePersistence</provider>
(как описано в правильном ответе Крисом: fooobar.com/questions/49958/...)В моем случае я узнал, что из-за неправильной конфигурации maven, hibernate-entitymanager jar не включался в зависимость, даже если это была временная зависимость другого модуля.
Если вы используете Eclipse, убедитесь, что шаблон исключения не удаляет ваш persistence.xml
из исходных папок на пути сборки.
MyProject/src/main/java -> Excluded: <your_pattern>
Excluded: (None)
, выбрав node и нажав кнопку Изменить... слева.Угловой регистр: если вы используете m2Eclipse, он автоматически помещается в ваши папки ресурсов. Затем, когда вы пытаетесь запустить тесты внутри eclipse, последующее отсутствие persistence.xml приведет к этой ошибке.
Я несколько лет опаздываю на вечеринку, но я столкнулся с тем же исключением, пытаясь заставить Hibernate 3.5.1 работать с HSQLDB и настольной программой JavaFX. Я получил его для работы с помощью этой темы и много проб и ошибок. Кажется, вы получаете эту ошибку для целого ряда проблем:
No Persistence provider for EntityManager named mick
Я пытался создать примеры учебников по hibernate, но из-за того, что я использовал 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>
Я, вероятно, потратил около половины дня на этот драгоценный камень. Я бы посоветовал начать очень просто - с одного тестового объекта с одним или двумя полями, так как кажется, что это исключение может иметь много причин.
Убедитесь, что вы создали файл persistence.xml в папке 'src'. Я создал в папке проекта, и это была моя проблема.
Это происходит, когда диспетчер объектов пытается указать на многие единицы сохранения. Выполните следующие действия:
Я столкнулся с той же проблемой, но на EclipseLink версии 2.5.0.
Я решил свою проблему, добавив еще один файл jar, который был обязательно (javax.persistence_2.1.0.v201304241213.jar.jar);
Необходимые банки:
- javax.persistence_2.1.0.v201304241213.jar
- eclipselink.jar
- jdbc.jar(в зависимости от используемой базы данных).
Надеюсь, это поможет.
У меня также была эта ошибка, но проблема заключалась в uri пространства имен в persistence.xml
.
Я заменил http://xmlns.jcp.org/xml/ns/persistence
на http://java.sun.com/xml/ns/persistence
и версию с 2.1 по 2.0.
Теперь он работает.
Вам нужно добавить hibernate-entitymanager-x.jar в путь к классам.
В Hibernate 4.x, если jar присутствует, то нет необходимости добавлять файл org.hibernate.ejb.HibernatePersistence в файле persistence.xml.
Если вы используете Maven, возможно, он не ищет подходящее место для папки META-INF. Другие упоминали о копировании папки, но другой способ, который работал у меня, заключался в том, чтобы сказать Maven, где искать его, используя тег <resources>
. См.: http://maven.apache.org/plugins/maven-resources-plugin/examples/resource-directory.html
Вопрос уже был дан, но просто хотел опубликовать подсказку, которая удерживала меня. Это исключение выбрасывалось после предыдущих ошибок. Я получал это:
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.
Вам нужно следующие файлы jar в пути к классам:
Я только что скопировал META-INF в src и работает!
Hibernate 5.2.5
Файлы Jar, необходимые в пути к классу. Это находится в требуемой папке Hibernate 5.2.5 Final release. Его можно загрузить из http://hibernate.org/orm/downloads/
Создайте 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>
EntityManagerFactor = Persistance.createEntityManagerFactory( "sample" );. "sample" может быть изменен в соответствии с вашим соглашением об именах.
Теперь создайте класс 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 + "]";
}
}
Теперь создайте класс с основным методом.
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.createEntityManagerFactory("JPAService")
есть разные имена в разных классах, чем вы получаете ошибку. Рефакторинг можно получить разными именами, которые были в моем случае. В одном классе автогенератор Persistence.createEntityManagerFactory("JPAService")
в private void initComponents()
, класс ContactTable отличался от Persistence.createEntityManagerFactory("JPAServiceExtended")
в классе DBManager.
Моя проблема была решена путем добавления информации в 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**);
В моем случае речь шла об ошибке в двух свойствах, как показано ниже. Когда я их изменил, "Отсутствует поставщик сохраняемости для EntityManager".
Таким образом, вы можете попробовать проверить соединение со своими свойствами, чтобы проверить, все ли правильно.
<property name="javax.persistence.jdbc.url" value="..."/>
<property name="javax.persistence.jdbc.password" value="..."/>
Странная ошибка, я из-за этого был полностью сбит с толку.