No Persistence provider for EntityManager named só quando eu uso JSF

25 respostas
8

Boa Tarde,

Estou com um problema há duas semanas,
Estou iniciando o desenvolvimento com Hibernate + JSF e estou recebendo o seguinte erro

Eu criei uma classe que usa Java Application só pra testar o Hibernate e dá tudo certo, consigo fazer a inserção no Banco de Dados,
mas quando eu todo no Browser, clico em salvar e me aparece a mensagem.

O arquivo persistence.xml está correto, tanto que eu consigo rodar uma classe de teste. O erro só acontece quando eu uso o JSF.

vlw

25 Respostas

H

Uma coisa é rodar local, outra coisa é web.

Quando vc faz o deploy da aplicação, seu arquivo persistence.xml está onde?

8

na pasta src eu criei uma subpasta src/META-INF mas eu ja tentei colocar na pasta WEB-INF/META-INF

8

Eu intendi o que você estava falando, eu coloquei em anexo uma imagem com a arquitetura das pastas.

Coloquei o arquivo persistence.xml na pasta WebContent mas não resolveu o problema,
continua retornando a página HTML:

HTTP Status 500 -

type Exception report

message

descriptionThe server encountered an internal error () that prevented it from fulfilling this request.

exception

javax.servlet.ServletException: javax.persistence.PersistenceException: No Persistence provider for EntityManager named Salao
root cause

javax.faces.el.EvaluationException: javax.persistence.PersistenceException: No Persistence provider for EntityManager named Salao
root cause

javax.persistence.PersistenceException: No Persistence provider for EntityManager named Salao
note The full stack traces of the exception and its root causes are available in the GlassFish Server Open Source Edition 3.0.1 logs.

Obrigado por me ajudar

H

Posta o código do persistence aí.

Deixa apenas um arquivo, apaga o que está dentro da pasta WEB-INF

8

Certo, removi o arquivo persistence.xml das pastas, agora ele só existe na pasta scr

Segue o código do arquivo persistence.xml

<?xml version="1.0" encoding="UTF-8"?> <persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence"> <persistence-unit name="Salao" transaction-type="RESOURCE_LOCAL"> <provider>org.hibernate.ejb.HibernatePersistence</provider> <class>entities.Servico</class> <properties> <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" /> <property name="hibernate.hbm2ddl.auto" value="update" /> <property name="hibernate.show_sql" value="true" /> <property name="hibernate.format_sql" value="true" /> <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" /> <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost/salao" /> <property name="javax.persistence.jdbc.user" value="root" /> <property name="javax.persistence.jdbc.password" value="" /> </properties> </persistence-unit> </persistence>

Esse é a nova arquitetura das pastas:

H

Pois é cara, foi oq eu te falei. Desktop é diferente de Web.

Isso aí é para desktop.

Tenta alterar para

8

alterei o transaction-type de “RESOURCE_LOCAL” para “JTA” mas não resolveu o problema.

fiz testes também copiando o persistence.xml para diferentes locais dentro da pasta WebContent mas o erro persiste.

H

Pois é, mas olha o seu erro: No Persistence provider for EntityManager named Servico

Ele ta procurando alguem chamado Servico. Seu PU vc chamou de Salao

8

Certo, eu fiz as correções no meu persistence.xml ele executa como app sem problemas basta mudar a linha

Quando eu tento rodar usando JSF eu coloco o que você me pediu

mas não funciona, dá a mensangem:
No Persistence provider for EntityManager named Salao

Vlw!

F

ja mudou no seu ManagerFactory tbm???

8

Penso que o meu ManagerFactory está correto, eu uso a mesma classe pra rodar web e desktop

package entities;

import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.persistence.*;

public class ServicoDAO {

	private EntityManagerFactory factory;;
	private EntityManager em;

	public void salvar(Servico s) {
		if (s.getCliente().equals("") == true || s.getData() == null) {
		}

		factory = Persistence.createEntityManagerFactory("Salao");
		em = factory.createEntityManager();

		em.getTransaction().begin();
		em.persist(s);
		em.getTransaction().commit();
		
	}
}
F
8eduardo8:
Penso que o meu ManagerFactory está correto, eu uso a mesma classe pra rodar web e desktop
package entities;

import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.persistence.*;

public class ServicoDAO {

	private EntityManagerFactory factory;;
	private EntityManager em;

	public void salvar(Servico s) {
		if (s.getCliente().equals("") == true || s.getData() == null) {
		}

		factory = Persistence.createEntityManagerFactory("Salao");
		em = factory.createEntityManager();

		em.getTransaction().begin();
		em.persist(s);
		em.getTransaction().commit();
		
	}
}

interessante.. vc esta usando o mesmo servidor no hosting?
pq se nao me engano o jboss ja vem com o hibernate.. se vc tiver usando um servidor por exemplo o tomcat.. vc tera que colocar as bibliotercas no .war

8

Me desculpe a ignorância, mas eu não sei como faz para gerar o .WAR com as bibliotecas do hibernate que estou usando

vlw

F

eclipse ne? clica em cima do seu projeto -> click no botao direito > export > exporto to war file…

mas antes adiciona todas as bibliotecas… OK?

8

Cara, eu andei dando uma pesquisada aqui sobre arquivo WAR, eu estou usando GlassFish, e pelo que vi ele já faz todas as configurações necessárias, mas eu fiz o que você me pediu. depois de gerar o arquivo eu abrir a configuração do GlassFish pelo browser “localhost:4848” e dei um ReDeploy usando o arquivo .War que eu gerei, mas continua com o mesmo erro.

vlw por estar me ajudando

8

Cara, eu andei dando
uma pesquisada aqui sobre arquivo WAR , eu estou usando GlassFish, e pelo que vi ele já faz todas as configurações necessarias, mas eu fiz o que você me pediu.
Depois de gerar o arquivo eu abrir a configuração do GlassFish pelo browser “localhost?4848” dei um ReDeploy usando o arquivo .War que eu gerei, mas continua com o mesmo erro.

vlw por estar me ajudando

F

cola aqui o log completo…

so pra ter certeza… as bibliotecas todas estao no projeto correto?

8

Eu não entendi direito o que você quer, mas estou postando todo o código e a página que me aparece, é bem simples só estou testando pra começar.

ESSA É A CLASSE DE COMUNICAÇÃO COM O JSF
package entities;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;

@ManagedBean
@SessionScoped
public class ServicoLogic {
	public Servico servico;
	
	public ServicoLogic(){
		servico = new Servico();
		servico.setCodigoDia(12);
	}
	
	public Servico getServico() {
		return servico;
	}

	public void setServico(Servico servico) {
		this.servico = servico;
	}

	public String grava(){
		ServicoDAO serv = new ServicoDAO();
		serv.salvar(servico);
		return "formulario";
	}
	
	
}
CLASSE QUE FAZ A PERSISTÊNCIA NO BANCO
package entities;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;

@ManagedBean
@SessionScoped
public class ServicoLogic {
	public Servico servico;
	
	public ServicoLogic(){
		servico = new Servico();
		servico.setCodigoDia(12);
	}
	
	public Servico getServico() {
		return servico;
	}

	public void setServico(Servico servico) {
		this.servico = servico;
	}

	public String grava(){
		ServicoDAO serv = new ServicoDAO();
		serv.salvar(servico);
		return "formulario";
	}
	
	
}
CLASSE DO MODELO
package entities;

import javax.faces.bean.ManagedBean;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@ManagedBean
@Entity
public class Servico {

	@Id
	@GeneratedValue
	private int id;
	private String cliente = "";
	private String data;
	private boolean status = false;;
	private int codigoDia = 0;

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getCliente() {
		return cliente;
	}

	public void setCliente(String cliente) {
		this.cliente = cliente;
	}

	public String getData() {
		return data;
	}

	public void setData(String data) {
		this.data = data;
	}

	public boolean isStatus() {
		return status;
	}

	public void setStatus(boolean status) {
		this.status = status;
	}

	public int getCodigoDia() {
		return codigoDia;
	}

	public void setCodigoDia(int codigoDia) {
		this.codigoDia = codigoDia;
	}
}
O MEU XHTML:
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html">
<h:head>
	<title>Cadastro de Usuário</title>
</h:head>
<h:body>
	<h:form>
		<h:panelGrid columns="2">
			
			<h:outputLabel value="Codigo Dia: "/>
			<h:outputLabel value="#{servicoLogic.servico.codigoDia}"/>
		
			<h:outputLabel value="Nome: "/>
			<h:inputText value="#{servicoLogic.servico.cliente}"/>
			
			<h:outputLabel value="Data: "/>
			<h:inputText value="#{servicoLogic.servico.data}"/>
			
			<h:commandButton action="#{servicoLogic.grava}" value="Salvar" />
		</h:panelGrid>
	</h:form>
</h:body>
</html>
O ERRO QUE DÁ NA PÁGINA WEB É:
HTTP Status 500 -

type Exception report

message

descriptionThe server encountered an internal error () that prevented it from fulfilling this request.

exception

javax.servlet.ServletException: javax.persistence.PersistenceException: No Persistence provider for EntityManager named Salao
root cause

javax.faces.el.EvaluationException: javax.persistence.PersistenceException: No Persistence provider for EntityManager named Salao
root cause

javax.persistence.PersistenceException: No Persistence provider for EntityManager named Salao
note The full stack traces of the exception and its root causes are available in the GlassFish Server Open Source Edition 3.0.1 logs.

GlassFish Server Open Source Edition 3.0.1

É AS BIBLIOTECAS QUE EU USO SÃO ESSAS:

F

entao esse erro acontece quando nao esta sendo reconhecido o provider… que no caso é o hibernate… achei que o problema fosse nas bibliotecas… por isso te perguntei tudo isso…
mas o que parece agora rs… e o persistence.xml

cola ele aqui…

8

Tá ai o meu persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0"
	xmlns="http://java.sun.com/xml/ns/persistence">
	<persistence-unit name="Salao" transaction-type="JTA">
		<property name="hibernate.show_sql" value="true" />
		<provider>org.hibernate.ejb.HibernatePersistence</provider>
		<class>entities.Servico</class>
		<properties>
			<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
			<property name="hibernate.hbm2ddl.auto" value="update" />
			<property name="hibernate.show_sql" value="true" />
			<property name="hibernate.format_sql" value="true" />
			<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
			<property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost/salao" />
			<property name="javax.persistence.jdbc.user" value="root" />
			<property name="javax.persistence.jdbc.password" value="" />
		</properties>
	</persistence-unit>
</persistence>

eu vi em um site uma linha para adicionar no arquivo mas eu coloquei e não mudou em nada

<jta-data-source>jdbc/salao</jta-data-source>
F

8eduardo8:
Tá ai o meu persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0"
	xmlns="http://java.sun.com/xml/ns/persistence">
	<persistence-unit name="Salao" transaction-type="JTA">
		<property name="hibernate.show_sql" value="true" />
		<provider>org.hibernate.ejb.HibernatePersistence</provider>
		<class>entities.Servico</class>
		<properties>
			<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
			<property name="hibernate.hbm2ddl.auto" value="update" />
			<property name="hibernate.show_sql" value="true" />
			<property name="hibernate.format_sql" value="true" />
			<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
			<property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost/salao" />
			<property name="javax.persistence.jdbc.user" value="root" />
			<property name="javax.persistence.jdbc.password" value="" />
		</properties>
	</persistence-unit>
</persistence>

eu vi em um site uma linha para adicionar no arquivo mas eu coloquei e não mudou em nada

<jta-data-source>jdbc/salao</jta-data-source>

bem cara… aparentemente ta tudo certo mesmo… vamos apelar pra coisas que nao sao obvias rs… (é o jeito)

<?xml version="1.0" encoding="UTF-8"?>  
<persistence version="1.0"  
    xmlns="http://java.sun.com/xml/ns/persistence">  
    <persistence-unit name="Salao" transaction-type="JTA">  
			<provider>org.hibernate.ejb.HibernatePersistence</provider> 
        <class>entities.Servico</class>  
        <properties>
	   <property name="hibernate.show_sql" value="true" />  
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />  
            <property name="hibernate.hbm2ddl.auto" value="update" />  
            <property name="hibernate.show_sql" value="true" />  
            <property name="hibernate.format_sql" value="true" />  
            <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />  
            <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost/salao" />  
            <property name="javax.persistence.jdbc.user" value="root" />  
            <property name="javax.persistence.jdbc.password" value="" />  
        </properties>  
    </persistence-unit>  
</persistence>

muda pra isso e ve se da…

8

Continua com o Erro, não sei mais o que fazer. Quando estou usando JTA não tem que incluir nenhuma biblioteca não??

8

[b]Cara até que em fim eu consegui resolver o problema,
estava lendo uma apostila de JSF, só que usava Tomcat e lá ensinava colocar os JAR do hibernate ja pasta “\WebContent\WEB-INF\lib”

eu fiz isso no meu projeto e deu certo

mas eu tive que tirar o código[/b]

transaction-type="JTA"

vlw pela força!

A

Boa noite faeldix, resolveu? Estou com o mesmo problema

8

Ola andretdb2,

posta o seu código ai, inclusive o arquivo “persistence.xml”.

Criado 6 de fevereiro de 2012
Ultima resposta 12 de dez. de 2012
Respostas 25
Participantes 4