Не указан поставщик сохраняемости для 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 ]

4 голосов
/ 24 июня 2018

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

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

3 голосов
/ 27 ноября 2011

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

2 голосов
/ 13 апреля 2014

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

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

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

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

2 голосов
/ 23 августа 2010

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

  1. откройте соответствующий файл в вашем редакторе (при условии, что ваш проект был закрыт в вашей IDE)
  2. удалить все коды персистентности и менеджера сущностей, связанные с
  3. сохранить файл
  4. откройте проект в вашей IDE
  5. теперь свяжите БД или таблицу по вашему выбору
2 голосов
/ 25 мая 2014

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

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

2 голосов
/ 15 декабря 2016

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

2 голосов
/ 25 апреля 2014

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

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

Сейчас работает.

1 голос
/ 12 мая 2011

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

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

1 голос
/ 18 октября 2012

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

JPA-PersistenceUnits: my-persistence-unit

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

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

1 голос
/ 06 декабря 2016

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

  1. antlr-2.7.7
  2. cdi-api-1.1
  3. одноклассник-1.3.0
  4. dom4j-1.6.1
  5. эш-апи-2,2
  6. Джеронимо-jta_1.1_spec-1.1.1
  7. hibernate-commons-annotation-5.0.1.Final
  8. hibernate-core-5.2.5.Final
  9. hibernate-jpa-2.1-api-1.0.0.Final
  10. jandex-2.0.3.Final
  11. Javassist-3.20.0-GA
  12. javax.inject-1
  13. JBoss-перехватчик-api_1.1_spec-1.0.0.Beta1
  14. jboss-logging-3.3.0.Final
  15. jsr250-апи-1,0

Создание XML-файла "persistence.xml" in

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>

  1. пожалуйста, запишите информацию, указанную в теге , и версия должна быть 2.1.
  2. обратите внимание на тег name , имя упоминается как "sample" . Это имя нужно использовать точно так же при загрузке

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 + "]";
    }
}

Теперь создайте класс с методом 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
...