Problemas com JPA

Boa tarde sou iniciante em java para web e estou tentando fazer uma tela de login usando o glassfish com mysql e hibernate, fiz alguns testes com a aplicação fazendo login de dentro de uma main e não deu erro algum, mas quando eu uso a tela de login da aplicação que é em um arquivo xhtml ela apresenta o seguinte erro:

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 sistema
root cause
javax.faces.el.EvaluationException: javax.persistence.PersistenceException: No Persistence provider for EntityManager named sistema
root cause
javax.persistence.PersistenceException: No Persistence provider for EntityManager named sistema

Já andei olhando em alguns lugares e em sua maioria pedem para verificar se o persistence.xml está na pasta src/META-INF mas meu persistence já está nessa pasta.

Segue meu arquivo persistence.xml:

<?xml version="1.0" encoding="UTF-8"?>
<persistence-unit name="sistema" transaction-type="RESOURCE_LOCAL">
	<provider>org.hibernate.ejb.HibernatePersistence</provider>
	<properties>
		<property name = "hibernate.dialect" value = "org.hibernate.dialect.MySQL5InnoDBDialect"/>
		<property name = "hibernate.hbm2ddl.auto" value = "update"/>
		<property name = "javax.persistence.jdbc.driver" value = "com.mysql.jdbc.Driver"/>
		<property name = "javax.persistence.jdbc.user" value = "root"/>
		<property name = "javax.persistence.jdbc.password" value = "root"/>
		<property name = "javax.persistence.jdbc.url" value = "jdbc:mysql://localhost:3306/sistema"/>
	</properties>
		
</persistence-unit>

Desde já agradeço

Troca de transaction-type=“RESOURCE_LOCAL” para transaction-type=“JTA”.

Quando você inicia a aplicação tem alguma mensagem de erro que aparece no console?

O erro continua mesmo alterando 'RESOURCE_LOCAL" para “JTA”.

Ao iniciar a aplicação não é mostrado nenhum erro nem no console nem no browser, apenas quando eu aperto o botão que aciona o ManagedBean aparece o erro que mencionei.

segue o managed bean:

import javax.faces.bean.ManagedBean;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;

@ManagedBean
public class TesteLogin {

private String nome;
private String senha;

public String login(){
	
	System.out.println("TesteLogin.login()");
	EntityManagerFactory factory = Persistence
			.createEntityManagerFactory("sistema");
	EntityManager manager = factory.createEntityManager();

	String usuario = this.nome;
	String comUser = "SELECT nome FROM Usuario WHERE nome=" + "\'"
			+ usuario + "\'";

	Query queryUser = manager.createQuery(comUser);
	String printUser = (String) queryUser.getSingleResult();

	String pass = this.senha;
	String comPass = "SELECT senha FROM Usuario WHERE nome=" + "\'"
			+ usuario + "\'";

	Query queryPass = manager.createQuery(comPass);
	String printPass = (String) queryPass.getSingleResult();

	if (printUser == null) {
		
		 return "pagina1";
	}
	if (printPass.compareTo(pass) != 0) {
		
		 return "pagina2";
	} else {
		
		 return "logado";
	}

}

public String getNome() {
	return nome;
}

public String getSenha() {
	return senha;
}

public void setSenha(String senha) {
	this.senha = senha;
}

public void setNome(String nome) {
	this.nome = nome;
}

}

e o arquivo que aciona ele:

<ui:composition template="/template.xhtml">

<ui:define name="conteudo">

	<h:form styleClass="form">
		<h:panelGrid columns="2">
			<h:outputLabel value="Usuário: " for="usuario" />
			<h:inputText id="usuario" value="#{testeLogin.nome}" />
			<h:outputLabel value="Senha: " for="senha" />
			<h:inputSecret id="senha" value="#{testeLogin.senha}" />
		</h:panelGrid>
	</h:form>
	<h:form>
		<h:commandButton styleClass="bot" value="Entrar" action="#{testeLogin.login}" />
	</h:form>
</ui:define>

</ui:composition>

Obrigado.

A ta, você ta criando na unha a conexão. Então deixa como RESOURCE_LOCAL mesmo.

Veja se no arquivo que vai para dentro do seu servidor, se o persistence.xml está indo dentro da pasta META-INF certinho.

OBS. Não esse arquivo tem que estar na pasta src/META-INF e não dentro de WEB-INF. Ele tem que ficar na raiz em que se encontram os pacotes da sua classe.

Desculpe a ignorância no assunto mas não entendi onde seria esse local, fora na pasta src/META-INF o persistence.xml deve estar em outro lugar?

Esse lugar é algum diretório onde o glassfish foi instalado ou algo assim?

Obrigado.

vc usa o netbeans ou eclipse? importou os jar’s do JPA?

Eu uso o eclipse.

Sim importei os jars do JPA, antes de fazer testes com a tela da aplicação eu fiz uma main para testar se o hibernate estava funcionando, usando a main funcionou, mas quando uso a tela aparece esse erro.

Fuçando por aqui nos diretórios do glassfish encontrei a pasta eclipseApps\Login (esse é o meu projeto) o arquivo persistence.xml está apenas nesse local eclipseApps\Login\WEB-INF\classes\META-INF ele deveria estar em outro lugar?

Obrigado.

Cria a pasta META-INF la no src do teu projeto ( onde fica teus fontes java ) e coloca teu persistence.xml la!

edit. O persistence.xml deve ficar na pasta META-INF junto dos teus fontes java.

O persistence já está na pasta src/META-INF o caminho que citei acima foi navegando pelas pastas onde o servidor foi instalado pois achei que podia ter algo relacionado com o que o jakefrog estava falando.

Posta como você ta criando seu EntityManager ae…

veja na imagem e compare com o seu…deve estar exatamente assim…

A estrutura de pastas está desse mesmo jeito da figura com o persistence.xml dentro da src/META-INF

Sobre o entityManager está aqui:

	EntityManagerFactory factory = Persistence
			.createEntityManagerFactory("sistema");
	EntityManager manager = factory.createEntityManager();

	String usuario = this.nome;
	String comUser = "SELECT nome FROM Usuario WHERE nome=" + "\'"
			+ usuario + "\'";

	Query queryUser = manager.createQuery(comUser);
	String printUser = (String) queryUser.getSingleResult();

	String pass = this.senha;
	String comPass = "SELECT senha FROM Usuario WHERE nome=" + "\'"
			+ usuario + "\'";

	Query queryPass = manager.createQuery(comPass);
	String printPass = (String) queryPass.getSingleResult();

esse acima funciona?

Funciona sim, teste ele usando uma main e ele fazia as operações no banco sem problemas. pq tem algo de errado com ele?

pelo contrário, se esse funciona está quase td pronto, só precisamos ver o q num funciona no otro…

Maravilha! ainda bem que já deu pra eliminar algo, então será que o erro está no xhtml que está chamando esse managed bean?

o código da página xhtml é esse aqui:

<ui:composition template="/template.xhtml">

<ui:define name=“conteudo”>

<h:form styleClass=“form”>
<h:panelGrid columns=“2”>
<h:outputLabel value=“Usuário: " for=“usuario” />
<h:inputText id=“usuario” value=”#{testeLogin.nome}" />
<h:outputLabel value=“Senha: " for=“senha” />
<h:inputSecret id=“senha” value=”#{testeLogin.senha}" />
</h:panelGrid>
</h:form>
<h:form>
<h:commandButton styleClass=“bot” value=“Entrar” action="#{testeLogin.login}" />
</h:form>
</ui:define>
</ui:composition>

post o managed bean pra darmos uma olhada…

segue o managed bean:

import javax.faces.bean.ManagedBean;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;

@ManagedBean
public class TesteLogin {

private String nome;
private String senha;

public String login(){

EntityManagerFactory factory = Persistence
.createEntityManagerFactory(“sistema”);
EntityManager manager = factory.createEntityManager();

String usuario = this.nome;
String comUser = “SELECT nome FROM Usuario WHERE nome=” + “’”

  • usuario + “’”;

Query queryUser = manager.createQuery(comUser);
String printUser = (String) queryUser.getSingleResult();

String pass = this.senha;
String comPass = “SELECT senha FROM Usuario WHERE nome=” + “’”

  • usuario + “’”;

Query queryPass = manager.createQuery(comPass);
String printPass = (String) queryPass.getSingleResult();

if (printUser == null) {

return “pagina1”;
}
if (printPass.compareTo(pass) != 0) {

return “pagina2”;
} else {

return “logado”;
}

}

public String getNome() {
return nome;
}

public String getSenha() {
return senha;
}

public void setSenha(String senha) {
this.senha = senha;
}

public void setNome(String nome) {
this.nome = nome;
}
}

toda as vezes q postar code use a tag code

Opa vlw o toque, não sabia como fazer pra deixar como vcs deixam.

segue o managed bean:



import javax.faces.bean.ManagedBean; 
import javax.persistence.EntityManager; 
import javax.persistence.EntityManagerFactory; 
import javax.persistence.Persistence; 
import javax.persistence.Query; 

@ManagedBean 
public class TesteLogin { 

private String nome; 
private String senha; 

public String login(){ 

System.out.println("TesteLogin.login()"); 
EntityManagerFactory factory = Persistence 
.createEntityManagerFactory("sistema"); 
EntityManager manager = factory.createEntityManager(); 

String usuario = this.nome; 
String comUser = "SELECT nome FROM Usuario WHERE nome=" + "\'" 
+ usuario + "\'"; 

Query queryUser = manager.createQuery(comUser); 
String printUser = (String) queryUser.getSingleResult(); 

String pass = this.senha; 
String comPass = "SELECT senha FROM Usuario WHERE nome=" + "\'" 
+ usuario + "\'"; 

Query queryPass = manager.createQuery(comPass); 
String printPass = (String) queryPass.getSingleResult(); 

if (printUser == null) { 

return "pagina1"; 
} 
if (printPass.compareTo(pass) != 0) { 

return "pagina2"; 
} else { 

return "logado"; 
} 

} 

public String getNome() { 
return nome; 
} 

public String getSenha() { 
return senha; 
} 

public void setSenha(String senha) { 
this.senha = senha; 
} 

public void setNome(String nome) { 
this.nome = nome; 
} 
}