Поставщик сущностей для EntityManager не указан

У меня есть мой 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. Тем не менее, я получил вышеуказанную ошибку.

Ответ 1

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

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

Ответ 2

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

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

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

Ответ 3

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

Ответ 4

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

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-entitymanager</artifactId>
    <version>4.2.6.Final</version>
</dependency>

Ответ 5

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

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

с

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

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

Ответ 6

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

Ответ 7

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

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

Ответ 8

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

  • проверьте, существует ли persistence.xml в вашем пути к классам
  • проверьте, находится ли поставщик hibernate в вашем пути к классам

При использовании JPA в автономном приложении (за пределами JavaEE) поставщик сохранения необходимо где-то указать. Это можно сделать двумя способами, о которых я знаю:

  • либо добавить элемент поставщика в блок персистентности: <provider>org.hibernate.ejb.HibernatePersistence</provider> (как описано в правильном ответе Крисом: fooobar.com/questions/49958/...)
  • или поставщик для интерфейса javax.persistence.spi.PersistenceProvider должен быть указан как служба, см. здесь: http://docs.oracle.com/javase/6/docs/api/java/util/ServiceLoader.html (это обычно включается, когда вы включаете спящий режим или другую реализацию JPA в свой путь к классам

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

Ответ 9

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

  • Перейдите на вкладку Свойства → Путь сборки Java → Источник.
  • Проверьте свой шаблон исключения, который находится в
    MyProject/src/main/java -> Excluded: <your_pattern>
    tree node
  • При необходимости установите Excluded: (None), выбрав node и нажав кнопку Изменить... слева.

Ответ 10

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

Ответ 11

Я несколько лет опаздываю на вечеринку, но я столкнулся с тем же исключением, пытаясь заставить 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>

Я, вероятно, потратил около половины дня на этот драгоценный камень. Я бы посоветовал начать очень просто - с одного тестового объекта с одним или двумя полями, так как кажется, что это исключение может иметь много причин.

Ответ 12

Убедитесь, что вы создали файл persistence.xml в папке 'src'. Я создал в папке проекта, и это была моя проблема.

Ответ 13

Это происходит, когда диспетчер объектов пытается указать на многие единицы сохранения. Выполните следующие действия:

  • откройте связанный файл в вашем редакторе (если ваш проект закрыт в вашей среде IDE)
  • удалить все связанные с персистентностью и связанным с ним файлы.
  • сохранить файл
  • откройте проект в своей среде IDE
  • теперь привяжите db или таблицу по вашему выбору.

Ответ 14

Я столкнулся с той же проблемой, но на EclipseLink версии 2.5.0.

Я решил свою проблему, добавив еще один файл jar, который был обязательно (javax.persistence_2.1.0.v201304241213.jar.jar);

Необходимые банки:
   - javax.persistence_2.1.0.v201304241213.jar
   - eclipselink.jar
   - jdbc.jar(в зависимости от используемой базы данных).

Надеюсь, это поможет.

Ответ 15

У меня также была эта ошибка, но проблема заключалась в uri пространства имен в persistence.xml.

Я заменил http://xmlns.jcp.org/xml/ns/persistence на http://java.sun.com/xml/ns/persistence и версию с 2.1 по 2.0.

Теперь он работает.

Ответ 16

Вам нужно добавить hibernate-entitymanager-x.jar в путь к классам.

В Hibernate 4.x, если jar присутствует, то нет необходимости добавлять файл org.hibernate.ejb.HibernatePersistence в файле persistence.xml.

Ответ 17

Если вы используете Maven, возможно, он не ищет подходящее место для папки META-INF. Другие упоминали о копировании папки, но другой способ, который работал у меня, заключался в том, чтобы сказать Maven, где искать его, используя тег <resources>. См.: http://maven.apache.org/plugins/maven-resources-plugin/examples/resource-directory.html

Ответ 18

Вопрос уже был дан, но просто хотел опубликовать подсказку, которая удерживала меня. Это исключение выбрасывалось после предыдущих ошибок. Я получал это:

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, который где-то кэшируется. Мне пришлось перезапустить сервер, а затем он работал.

Ответ 19

В OSGi-контексте необходимо перечислить единицы персистентности в пакете MANIFEST.MF, например

JPA-PersistenceUnits: my-persistence-unit

В противном случае пакет JPA не будет знать, что ваш пакет содержит единицы сохранения.

См. http://wiki.eclipse.org/EclipseLink/Examples/OSGi/Developing_with_EclipseLink_OSGi_in_PDE.

Ответ 20

Вам нужно следующие файлы jar в пути к классам:

  • antlr-2.7.6.jar
  • Обще-коллекция-3.1.jar
  • dom4j-1.6.1.jar
  • hibernate-commons-annotations-4.0.1.Final.jar
  • hibernate-core-4.0.1.Final.jar
  • hibernate-entitymanager.jar
  • hibernate-jpa-2.0-api-1.0.0.Final.jar
  • javassist-3.9.0.jar
  • jboss-logging-3.1.1.GA.jar
  • jta-1.1.jar
  • slf4j-api-1.5.8.jar
  • ххх-JDBC-driver.jar

Ответ 21

Я только что скопировал META-INF в src и работает!

Ответ 22

Hibernate 5.2.5
Файлы Jar, необходимые в пути к классу. Это находится в требуемой папке Hibernate 5.2.5 Final release. Его можно загрузить из http://hibernate.org/orm/downloads/

  • antlr-2.7.7
  • cdi-api-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>

  • обратите внимание на информацию, указанную в <persistance> и версия должны быть 2.1.
  • обратите внимание на имя < persistance-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

Ответ 23

Если в Persistence.createEntityManagerFactory("JPAService") есть разные имена в разных классах, чем вы получаете ошибку. Рефакторинг можно получить разными именами, которые были в моем случае. В одном классе автогенератор Persistence.createEntityManagerFactory("JPAService") в private void initComponents(), класс ContactTable отличался от Persistence.createEntityManagerFactory("JPAServiceExtended") в классе DBManager.

Ответ 24

Моя проблема была решена путем добавления информации в 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>

Ответ 25

Проверьте постоянное имя устройства

<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**);

Ответ 26

В моем случае речь шла об ошибке в двух свойствах, как показано ниже. Когда я их изменил, "Отсутствует поставщик сохраняемости для EntityManager".

Таким образом, вы можете попробовать проверить соединение со своими свойствами, чтобы проверить, все ли правильно.

<property name="javax.persistence.jdbc.url" value="..."/>
<property name="javax.persistence.jdbc.password" value="..."/>

Странная ошибка, я из-за этого был полностью сбит с толку.