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

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

Uma coisa é rodar local, outra coisa é web.

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

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

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:

[code]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.[/code]

Obrigado por me ajudar

Posta o código do persistence aí.

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

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:

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

Isso aí é para desktop.

Tenta alterar para

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.

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

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!

ja mudou no seu ManagerFactory tbm???

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

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

}[/code]

[quote=8eduardo8]Penso que o meu ManagerFactory está correto, eu uso a mesma classe pra rodar web e desktop

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

}[/code][/quote]

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

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

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

mas antes adiciona todas as bibliotecas… OK?

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

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

cola aqui o log completo…

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

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

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

}
[/code]

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:

[code]<?xml version='1.0' encoding='UTF-8' ?>

Cadastro de Usuário
		<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>

[/code]

O ERRO QUE DÁ NA PÁGINA WEB É:

[code]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[/code]

É AS BIBLIOTECAS QUE EU USO SÃO ESSAS:


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…