Nenhum provedor de persistência para o EntityManager chamado


148

Eu tenho o meu persistence.xmlcom o mesmo nome usando TopLinksob o META-INFdiretório Então, eu tenho meu código chamando-o com:

EntityManagerFactory emfdb = Persistence.createEntityManagerFactory("agisdb");

No entanto, recebi a seguinte mensagem de erro:

2009-07-21 09: 22: 41,018 [main] ERRO - Nenhum provedor de persistência para o EntityManager chamado agisdb
javax.persistence.PersistenceException: nenhum provedor de persistência para EntityManager chamado agisdb
    em javax.persistence.Persistence.createEntityManagerFactory (Persistence.java:89)
    em javax.persistence.Persistence.createEntityManagerFactory (Persistence.java:60)

Aqui está o 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>

Deveria estar no caminho de classe. No entanto, eu recebi o erro acima.

Respostas:


85

Depois <persistence-unit name="agisdb">, defina o nome do provedor de persistência:

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

5
Estou usando o Derby e não foi necessário especificar isso (sim, mas o removi depois que resolvi o problema, apenas para ter certeza). Finalmente, eu estava recebendo o erro porque persistence.xml não estava na pasta src / META-INF, mesmo que estivesse em uma pasta no caminho de origem do Eclipse para o projeto. Estou pensando em algum lugar é hard-wired para estar em src / *
Fuhrmanator

6
isso não foi necessário no meu caso, mas o caminho de classe hibernate-entitymanager * .jar, como indicado na resposta de Ualter Jr abaixo. Estou usando um aplicativo GWT independente com o hibernate-core-4.3.7.jar , o hibernate-entitymanager-4.3.7.Final.jar e o hibernate-jpa-2.1-api-1.0.0.jar .
Andreas Dietrich

3
O mesmo com @AndreasDietrich, depois de substituir o artefato "hibernate-core-4.3.10" por "hibernate-entitymanager-4.3.10" no pom.xml (eu uso o maven), esse erro se foi. Na verdade, o hibernate.org/orm/downloads diz que você deve usar o "hibernate-entitymanager-4.3.10" para o JPA.
Hong

1
Além disso, também tive que passar do hibernate-entitymanager-3.4.0.GA para 3.6.10.Final . Apenas no caso de você ainda tem uma base de código legado usando Hibernate 3.
Javi Vazquez

5
Estou um pouco surpreso por você não ter um problema com o seu <provider/>, enquanto estiver usando o hibernate-4, você deve mudar seu provedor <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>, consulte stackoverflow.com/questions/23041964/… .
Rob

86

Coloque o "hibernate-entitymanager.jar"no caminho de classe do aplicativo.
Para versões mais recentes, você deve usar em "hibernate-core.jar"vez do obsoletohibernate-entitymanager

Se você estiver executando algum IDE, como o Eclipse :Project Properties -> Java Build Path -> Libraries.

Caso contrário, coloque-o no /libaplicativo.


3
Levei algumas horas para descobrir que essa era a causa. Para outras pessoas que pesquisam esse jar sangrento, no caso do Hibernate 4.1.3, está no hibernate-release-4.1.3.Final \ lib \ jpa \ hibernate-entitymanager-4.1.3.Final.jar
Vedran

7
E para aqueles de nós que estão usando o Maven, isso seria org.hibernateartefato de grupohibernate-entitymanager
Simon Forsberg

2
Foi eclipselink.jar para mim, que estava faltando no caminho. No hibernate * something.jar no caminho.
desconhecido usuário

3
Passei algumas horas confirmando persistence.xml no caminho da classe e comparando todas as facetas de um projeto para o qual funcionou e um projeto para o qual não funcionou. Mensagem de erro muito enganosa, pois pode ocorrer se estiver faltando persistence.xml, se estiver faltando a PU com esse nome ou, aparentemente, se estiver faltando um jar de hibernação!
David Mann

Para mim foi org.eclipse.persistence.jpacom teste de escopo.
Marek

67

Verifique se o persistence.xmlarquivo está no diretório:<webroot>/WEB-INF/classes/META-INF


8
isso não funcionou para mim, trouxe a unidade de persistência não encontrada: erro 'nulo'. Movendo-o de volta para /src/main/resources/META-INF/persistence.xml
tomasb

1
Eu acho que isso se aplica a quem está usando o toplink (ou outras coisas relacionadas à Web), pois todas as outras respostas aqui podem ser mais apropriadas.
Simon Forsberg

2
Obrigado, para mim o caminho é target / classes / META-INF
Frizz1977 3/16/16

O mesmo, por algum motivo estranho, ele precisa estar em um diretório META-INF, caso contrário não funcionará ... #
Thomas

17

Eu precisava disso no meu arquivo pom.xml:

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

Funciona para a versão 4.3.11.
precisa saber é

Está obsoleto, veja acima. Use o hibernate-core.
foo

16

Enfrentou o mesmo problema e não conseguiu encontrar a solução por um longo tempo. No meu caso, ajudou a substituir

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

com

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

Tomou a solução daqui


2
A atualização do Hibernate 4.3.5 para 5.2.12 e a alteração do nome do provedor corrigiram o problema para mim. Essa configuração parece permitir que o JPA use o arquivo .jar principal em vez do .jar do gerenciador de entidades que aparece como obsoleto no repositório central do Maven. Muito obrigado por compartilhar.
Joshpt 19/11

10

Há outro ponto: se você enfrentar esse problema em um ambiente Eclipse RCP, poderá ser necessário alterar a geração do Factory de Persistence.createEntityManagerFactoryparanew PersistenceProvider().createEntityManagerFactory

veja ECF para uma discussão detalhada sobre isso.


Este era o problema exato que eu estava tendo com o org.eclipse.persistence.jpa 2.4.0. Eu literalmente passei 2 horas puxando meu cabelo, me perguntando por que ele não encontrou meu persisence.xml. Todos os exemplos não parecem incorporar isso. oh bem ... muito obrigado!
Mark3

9

Talvez você tenha definido um provedor como, <provider>org.hibernate.ejb.HibernatePersistence</provider>mas fazendo referência a outro no jar. Isso aconteceu comigo: meu provedor persistence.xml era openjpa, mas eu estava usando o eclipselink no meu caminho de classe. Espero que esta ajuda!


7

Conselho rápido:

  • verifique se persistence.xml está no seu caminho de classe
  • verifique se o provedor de hibernação está no seu caminho de classe

Com o uso do JPA no aplicativo independente (fora do JavaEE), um provedor de persistência precisa ser especificado em algum lugar. Isso pode ser feito de duas maneiras que eu conheço:

No meu caso, descobri que, devido a uma configuração incorreta, o jar do hibernate-entitymanager não foi incluído como uma dependência, mesmo que fosse uma dependência transitória de outro módulo.


/ facepalm - Esqueci-me de adicionar a dependência maven para o provedor de hibernação. Obrigado!
precisa saber é

5

Se você estiver usando o Eclipse, verifique se o padrão de exclusão não remove as persistence.xmlpastas de origem no caminho de construção.

  1. Vá para Propriedades -> Caminho de Construção Java -> guia Origem
  2. Verifique seu padrão de exclusão localizado no
    MyProject/src/main/java -> Excluded: <your_pattern>
    nó da árvore
  3. Opcionalmente, defina- Excluded: (None)o selecionando o nó e clicando no botão Editar ... à esquerda.

Resolveu o meu problema. O padrão excluído foi definido como "**" após uma busca / retirada. Não sei porquê ...
Jocelyn

5

Estou alguns anos atrasado para a festa aqui, mas acertei a mesma exceção ao tentar fazer o Hibernate 3.5.1 trabalhar com HSQLDB e um programa JavaFX para desktop. Consegui trabalhar com a ajuda deste tópico e com muitas tentativas e erros. Parece que você recebeu esse erro para uma variedade de problemas:

No Persistence provider for EntityManager named mick

Tentei criar os exemplos de tutorial de hibernação, mas como estava usando o Java 10, não consegui fazê-los construir e executar facilmente. Desisti disso, não querendo perder tempo resolvendo seus problemas. Configurar um arquivo module-info.java (Jigsaw) é outra bola de cabelo que muitas pessoas ainda não descobriram.

Um pouco confuso é que esses (abaixo) eram os únicos dois arquivos que eu precisava no meu arquivo build.gradle. A documentação do Hibernate não está clara sobre exatamente quais Jars você precisa incluir. O gerenciador de entidades estava causando confusão e não é mais necessário na versão mais recente do Hibernate, nem o javax.persistence-api. Observe que estou usando o Java 10 aqui, então tive que incluir o jaxb-api, para solucionar alguns erros de ligação ao xml, além de adicionar uma entrada para o módulo de persistência java no meu arquivo 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;

Com o hibernate 5.3.1, você não precisa especificar o provedor abaixo no seu arquivo persistence.xml. Se não for fornecido, o provedor de hibernação é escolhido por padrão.

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

O arquivo persistence.xml deve estar localizado no diretório correto para:

src/main/resources/META-INF/persistence.xml

Percorrer o código-fonte de hibernação no depurador Intellij, onde verifica um dialeto, também lançou a mesma exceção, devido a uma propriedade de dialeto ausente no arquivo persistence.xml. Eu adicionei isso (adicione o correto para o seu tipo de banco de dados):

<property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/>

Eu ainda recebi a mesma exceção depois disso, portanto, percorrer o depurador novamente no Intellij revelou que a entidade de teste que eu estava tentando persistir (exemplo simples de pai e filho) tinha anotações ausentes para os relacionamentos OneToMany, ManyToOne. Corrigi isso e a exceção foi embora e minhas entidades foram mantidas ok.

Aqui está meu persistence.xml final completo:

<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>

Eu provavelmente desperdicei cerca de meio dia nesta jóia. Meu conselho seria começar muito simples - uma única entidade de teste com um ou dois campos, pois parece que essa exceção pode ter muitas causas.


Muito obrigado pelos detalhes da configuração. Realmente ajudou a resolvê-lo.
Doogle

4

Caixa de canto: se você estiver usando o m2Eclipse, ele exclui automaticamente as pastas de recursos. Então, ao tentar executar testes dentro do eclipse, a subsequente ausência de persistence.xml produzirá esse erro.


3

Verifique se você criou o arquivo persistence.xml na pasta 'src'. Eu criei na pasta do projeto e esse foi o meu problema.


O Eclipse 4.4.0 não deseja aninhar pastas SRC, então eu estava colocando o META-INF no nível superior, pensando que persistence.xml estar no caminho de classe seria adequado. NÃO! Eu tive que criar manualmente um src / META-INF (no sistema operacional) e mover o arquivo persistence.xml manualmente. Talvez seja possível fazer isso no Eclipse, mas não consegui descobrir.
Fuhrmanator 19/07/2014


2

Isso acontece quando o gerente da entidade está tentando apontar para muitas unidades de persistência. Execute os seguintes passos:

  1. abra o arquivo relacionado no seu editor (desde que o seu projeto tenha sido fechado no seu IDE)
  2. exclua todo o código relacionado à persistência e ao gerenciador de entidades
  3. Salve o arquivo
  4. abra o projeto no seu IDE
  5. agora ligue o db ou a tabela de sua escolha

2

Eu enfrentei o mesmo problema, mas no EclipseLink versão 2.5.0 .

Resolvi meu problema adicionando outro arquivo jar que era necessariamente ( javax.persistence_2.1.0.v201304241213.jar.jar );

Frascos necessários:
- javax.persistence_2.1.0.v201304241213.jar
- eclipselink.jar
- jdbc.jar (dependendo do banco de dados usado).

Eu espero que isso ajude.


2

Eu também tive esse erro, mas o problema era o uri do espaço para nome no persistence.xml.

Troquei http://xmlns.jcp.org/xml/ns/persistencea http://java.sun.com/xml/ns/persistenceea versão 2.1 para 2.0.

Agora está funcionando.


Foi exatamente o que aconteceu comigo usando o Tomcat. Acabei de adicionar um cabeçalho completo para esclarecer os novos usuários.
childno͡.de 6/06

2

Você precisa adicionar o hibernate-entitymanager-x.jar no caminho de classe.

No Hibernate 4.x, se o jar estiver presente, não será necessário adicionar o arquivo org.hibernate.ejb.HibernatePersistence no arquivo persistence.xml.


1

A pergunta já foi respondida, mas só queria postar uma dica que estava me segurando. Esta exceção estava sendo lançada após erros anteriores. Eu estava entendendo isso:

property toplink.platform.class.name is deprecated, property toplink.target-database should be used instead.

Embora eu tenha alterado o persistence.xml para incluir o novo nome da propriedade:

<property name="toplink.target-database" value="oracle.toplink.platform.database.oracle.Oracle10Platform"/>

Após a mensagem sobre o nome da propriedade preterida, eu estava recebendo a mesma PersistenceException como acima e toda uma outra seqüência de exceções. Minha dica: verifique o início da salsicha de exceção.

Parece haver um bug no Glassfish v2.1.1 em que as reimplanta ou desimplanta e implanta não estão atualizando o persistence.xml, que está sendo armazenado em cache em algum lugar. Eu tive que reiniciar o servidor e funcionou.



1

Você precisa dos seguintes arquivos jar no caminho de classe:

  1. antlr-2.7.6.jar
  2. commons-collections-3.1.jar
  3. dom4j-1.6.1.jar
  4. hibernate-commons-annotations-4.0.1.Final.jar
  5. hibernate-core-4.0.1.Final.jar
  6. hibernate-entitymanager.jar
  7. hibernate-jpa-2.0-api-1.0.0.Final.jar
  8. javassist-3.9.0.jar
  9. jboss-logging-3.1.1.GA.jar
  10. jta-1.1.jar
  11. slf4j-api-1.5.8.jar
  12. xxx-jdbc-driver.jar


1


Arquivos de Jar do Hibernate 5.2.5 Requeridos no caminho da classe. Isso está dentro de uma pasta necessária da versão final do Hibernate 5.2.5. Pode ser baixado em http://hibernate.org/orm/downloads/

  1. antlr-2.7.7
  2. cdi-api-1.1
  3. classmate-1.3.0
  4. dom4j-1.6.1
  5. el-api-2.2
  6. geronimo-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-interceptor-api_1.1_spec-1.0.0.Beta1
  14. jboss-logging-3.3.0.Final
  15. jsr250-api-1.0

Crie um arquivo xml "persistence.xml" em

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. observe as informações mencionadas na tag <persistance> e a versão deve ser 2.1.
  2. observe a tag <persistance-unit>, o nome é mencionado como "amostra" . Esse nome precisa ser usado exatamente da mesma maneira ao carregar o seu

EntityManagerFactor = Persistance.createEntityManagerFactory ("amostra"); . "amostra" pode ser alterado conforme sua convenção de nomenclatura.

Agora crie uma classe de entidade. com o nome conforme meu exemplo UserDetail, no pacote 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 + "]";
    }
}

Agora crie uma classe com o método principal.

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();
        }

    }

}

A saída será

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

1

No meu caso, anteriormente eu uso o idea para gerar entidade pelo esquema do banco de dados, e o persistence.xmlé gerado automaticamente src/main/java/META-INFe, de acordo com https://stackoverflow.com/a/23890419/10701129 , movo-o parasrc/main/resources/META-INF , também marcado META-INF como raiz de origem. Funciona para mim.

Mas simplesmente marcar o META-INF original (ou seja, src / main / java / META-INF) como raiz de origem não funciona, o que me confunde.

e este é o estrutura: insira a descrição da imagem aqui


0

Se houver nomes diferentes em Persistence.createEntityManagerFactory("JPAService")classes diferentes, você receberá o erro. Ao refatorar, é possível obter nomes diferentes, como no meu caso. Em uma das aulas da auto-gerado Persistence.createEntityManagerFactory("JPAService")em private void initComponents(), classe ContactsTable diferiam Persistence.createEntityManagerFactory("JPAServiceExtended")na classe DBManager.


0

O meu foi resolvido adicionando informações no persistence.xml, por exemplo, <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>e certificando-se de que você tenha a biblioteca no caminho de classe, por exemplo, no Maven, adicione dependência como

<dependency>
  <groupId>org.eclipse.persistence</groupId>
  <artifactId>eclipselink</artifactId>
  <version>2.5.0</version>
</dependency>

0

Verifique o nome da unidade peristente

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

0

No meu caso, tratava-se de erro em duas propriedades, como abaixo. Quando os alterei 'O provedor sem persistência para o EntityManager chamado' desapareceu.

Portanto, você pode tentar testar a conexão com suas propriedades para verificar se tudo está correto.

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

Erro estranho, fiquei totalmente confuso por causa disso.


0

Tentar também copiar o persistence.xml manualmente para a pasta <project root>\bin\META-INF. Isso corrigiu o problema no Eclipse Neon com o EclipseLink 2.5.2uso de um projeto de plug-in simples.


0

Teve o mesmo problema, mas isso realmente funcionou para mim:

mvn install -e  -Dmaven.repo.local=$WORKSPACE/.repository.

Nota: O comando maven acima irá reinstalar todas as dependências do seu projeto a partir do zero. Seu console será carregado com logs detalhados devido à solicitação de rede que o maven está fazendo.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.