Crud JPA + Hibernate + JSF

Galera, estou com uma dificuldade para fazer um Crud em meu sistema…
Por algum motivo não está inserindo dados no banco de dados, abaixo o código Bean, DAO, Model e XHTML:

MODEL:

package br.com.fecorp.reinf.model;

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

@Table(name = “cadastrologin”)
@Entity
public class TelaCadastroLogin implements Serializable{

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "nome", unique = true)
private String nome;

@Column(name = "login", nullable = false)
private String login;

@Column(name = "senha", nullable = false)
private String senha;

@Column(name = "departamento", nullable = false)
private String departamento;

public String getNome() {
	return nome;
}

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

public String getLogin() {
	return login;
}

public void setLogin(String login) {
	this.login = login;
}

public String getSenha() {
	return senha;
}

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

public String getDepartamento() {
	return departamento;
}

public void setDepartamento(String departamento) {
	this.departamento = departamento;
}

}

BEAN:

package br.com.fecorp.reinf.Bean;

import java.io.Serializable;

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

import br.com.fecorp.reinf.DAO.TelaCadastroLoginDAO;
import br.com.fecorp.reinf.model.TelaCadastroLogin;

@ManagedBean
@SessionScoped
public class CadastroLoginBean implements Serializable{

private TelaCadastroLogin cadastroLogin = new TelaCadastroLogin();
private TelaCadastroLoginDAO cadastroLoginDAO;


public TelaCadastroLogin getCadastroLogin() {
	return cadastroLogin;
}
public void setCadastroLogin(TelaCadastroLogin cadastroLogin) {
	this.cadastroLogin = cadastroLogin;
}
public TelaCadastroLoginDAO getCadastroLoginDAO() {
	return cadastroLoginDAO;
}
public void setCadastroLoginDAO(TelaCadastroLoginDAO cadastroLoginDAO) {
	this.cadastroLoginDAO = cadastroLoginDAO;
}

}

DAO:

package br.com.fecorp.reinf.DAO;

import java.io.Serializable;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.PersistenceContext;

import br.com.fecorp.reinf.model.TelaCadastroLogin;

public abstract class TelaCadastroLoginDAO< T extends Serializable > {

private Class< T > clazz;

@PersistenceContext
EntityManagerFactory factory = Persistence.createEntityManagerFactory("PersistenciaPU");
EntityManager em = factory.createEntityManager();

TelaCadastroLogin cadastroLogin = new TelaCadastroLogin();

public void salvar(T cadastroLogin){
	em.persist(cadastroLogin);
}

public void atualizar(T cadastroLogin){
	em.merge(cadastroLogin);
}

public void deletar(T cadastroLogin){
	em.remove(cadastroLogin);
}

}

XHTML:

<h:form>
<p:fieldset style=" background-color:#F2F2F2; font-size: 10px"
id=“cadastroLogin” legend="Usuário ">
<h:form>

			<h:outputLabel style="font-size: 10px"  for="nome" value="  Nome :      " />
			 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;   &nbsp;
			<p:inputText style="width: 15%; " id="nome" label="nome" value="#{cadastroLoginBean.cadastroLogin.nome}"/>
			<br></br>
			<br></br>
			
			<h:outputLabel style="font-size: 10px" for="departamento" value=" Departamento :&nbsp;     " />
			<p:inputText style="width: 15%; " id="departamento" label="departamento" value="#{cadastroLoginBean.cadastroLogin.departamento}"/>
			<br></br>
			<br></br>
			
			<h:outputLabel style="font-size: 10px" for="log" value=" Login :&nbsp;     " />
			&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;   &nbsp;
			<p:inputText style="width: 15%; " id="log"  label="log" value="#{cadastroLoginBean.cadastroLogin.login}"/>
			<br></br>
			<br></br>
			
			<h:outputLabel style="font-size: 10px" for="senha" value=" Senha:&nbsp;     " />
			&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;   &nbsp;
			 <p:inputText type="password" style="width: 15%; value=" id="senha" label="senha" value="#{cadastroLoginBean.cadastroLogin.senha}"/>
			
			<br></br>
			<br></br> 


						<p:commandButton value="Limpar" type="reset" />
                         &nbsp; &nbsp;
						 <h:commandButton rendered="true"  value="Enviar" icon="ui-icon-star" action="#{cadastroLoginBean.cadastroLoginDAO.salvar}" update="form"  /> 
						
                
                
	    </h:form>
	
		
        <br></br> 
		
				</p:fieldset>

Qual servidor você está usando? Como está sendo tratada a transação?

Bom dia, quando se quer salvar algo, você tem que abrir uma transação.

em.getTransaction().begin();//Abre a transação
salvar(obj);
em.getTransaction().commit();//Finaliza a transaçao

No método salvar ?

Estou usando o Wildfly 9.0.2

Creio que esta faltando alguma configuração, pois nem o teste no main roda, aparece estas seguintes exceções:

log4j:WARN No appenders could be found for logger (org.jboss.logging).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
Exception in thread “main” javax.persistence.PersistenceException: Unable to build entity manager factory
at org.hibernate.jpa.HibernatePersistenceProvider.createEntityManagerFactory(HibernatePersistenceProvider.java:81)
at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:54)
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:55)
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:39)
at br.com.fecorp.reinf.DAO.Conexao.getEntityManager(Conexao.java:18)
at br.com.fecorp.reinf.DAO.TesteConexao.main(TesteConexao.java:19)
Caused by: org.hibernate.engine.jndi.JndiException: Unable to lookup JNDI name [java:jboss/datasources/ReinfDS]
at org.hibernate.engine.jndi.internal.JndiServiceImpl.locate(JndiServiceImpl.java:117)
at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.configure(DatasourceConnectionProviderImpl.java:115)
at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:111)
at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:234)
at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:206)
at org.hibernate.engine.jdbc.internal.JdbcServicesImpl.buildJdbcConnectionAccess(JdbcServicesImpl.java:260)
at org.hibernate.engine.jdbc.internal.JdbcServicesImpl.configure(JdbcServicesImpl.java:94)
at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:111)
at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:234)
at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:206)
at org.hibernate.cfg.Configuration.buildTypeRegistrations(Configuration.java:1885)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1843)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:850)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:843)
at org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl.withTccl(ClassLoaderServiceImpl.java:397)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:842)
at org.hibernate.jpa.HibernatePersistenceProvider.createEntityManagerFactory(HibernatePersistenceProvider.java:73)
… 5 more
Caused by: javax.naming.NameNotFoundException; remaining name 'jboss/datasources/ReinfDS’
at org.eclipse.jetty.jndi.NamingContext.lookup(NamingContext.java:532)
at org.eclipse.jetty.jndi.java.javaRootURLContext.lookup(javaRootURLContext.java:99)
at javax.naming.InitialContext.lookup(InitialContext.java:421)
at org.hibernate.engine.jndi.internal.JndiServiceImpl.locate(JndiServiceImpl.java:114)
… 21 more

Código do teste:

public class TesteConexao {

public static void main(String[] args) {
	

	
		TelaCadastroLogin cadastro = new TelaCadastroLogin();
		cadastro.setDepartamento("jj");
		cadastro.setLogin("jj");
        cadastro.setNome("jj");		
		cadastro.setSenha("jj");
		
		EntityManager em = new Conexao().getEntityManager();
		   
		  em.getTransaction().begin();
		  em.persist(cadastro);
		  em.getTransaction().commit();
	
	
	 }

O problema está no seu datasource. O JNDI usado pelo datasource (jboss/datasources/ReinfDS) não esta sendo localizado no arquivo de configuração. Veja se a informação está correta no seu standalone.xml ou domain.xml.

Poste tb seu persistence.xml, please

Bom dia Raphael, aqui está meu persistence:

<?xml version="1.0"?>

<persistence-unit name="PersistenciaPU" transaction-type="JTA">


	<!-- provedor/implementacao do JPA -->
	<provider>org.hibernate.ejb.HibernatePersistence</provider>
	<jta-data-source>java:jboss/datasources/ReinfDS</jta-data-source>
	  
	 
	
	<!-- entidade mapeada -->
	<class>br.com.fecorp.reinf.model.TelaGeracao</class>
	<class>br.com.fecorp.reinf.model.Usuario</class>
	<class>br.com.fecorp.reinf.model.Cprb</class>
	<class>br.com.fecorp.reinf.model.comercializacaoAgro</class>
	<class>br.com.fecorp.reinf.model.ComplementoAlimeEntrada</class>
	<class>br.com.fecorp.reinf.model.ClientesFornecedores</class>
	<class>br.com.fecorp.reinf.model.ComplementoAlimeSaida</class>
	<class>br.com.fecorp.reinf.model.ComplementoMestreEntrada</class>
	<class>br.com.fecorp.reinf.model.ComplementoMestreSaida</class>
	<class>br.com.fecorp.reinf.model.ComplementoTotalizadorEntrada</class>
	<class>br.com.fecorp.reinf.model.ComplementoTotalizadorSaida</class>
	<class>br.com.fecorp.reinf.model.Empresa</class>
	<class>br.com.fecorp.reinf.model.Filial</class>
	<class>br.com.fecorp.reinf.model.ImpostoEntrada</class>
	<class>br.com.fecorp.reinf.model.ImpostoSaida</class>
	<class>br.com.fecorp.reinf.model.MestreEntrada</class>
	<class>br.com.fecorp.reinf.model.MestreSaida</class>
	<class>br.com.fecorp.reinf.model.ProcessosADMJud</class>
	<class>br.com.fecorp.reinf.model.ReceitaEspetaculoDesp</class>
	<class>br.com.fecorp.reinf.model.RecursosRecbAssDep</class>
	<class>br.com.fecorp.reinf.model.RecursosRepAssDesp</class>
	<class>br.com.fecorp.reinf.model.Responsavel</class>
	<class>br.com.fecorp.reinf.model.Software</class>
	<class>br.com.fecorp.reinf.model.DadosTelaPesquisa</class>
	<class>br.com.fecorp.reinf.model.TelaConfiguracao</class>
	<class>br.com.fecorp.reinf.model.TelaServicos</class>
	<class>br.com.fecorp.reinf.model.Login</class>
	<class>br.com.fecorp.reinf.model.TelaCadastroLogin</class>


	
	<!-- <class>br.com.fecorp.reinf.model.TelaCadastroLogin</class>-->
	<!-- <class>br.com.fecorp.reinf.model.TelaConfiguracao</class>-->
	<!-- <class>br.com.fecorp.reinf.model.TelaGeracao</class>-->
	<!-- <class>br.com.fecorp.reinf.model.TelaServicos</class>-->
	



	<exclude-unlisted-classes>true</exclude-unlisted-classes>
<!-- <validation-mode>NONE</validation-mode> -->	


	
	<properties>

		<!-- dados da conexao -->

		<property name="javax.persistence.jdbc.driver" value="org.postgresql.Driver" />
		<property name="javax.persistence.jdbc.url" value="jdbc:postgresql://localhost/dbReinf" />
		<property name="javax.persistence.jdbc.user" value="postgres" />
		<property name="javax.persistence.jdbc.password" value="fecorp" />
		
		
		<!-- <property name="javax.persistence.jdbc.url" value="jdbc:postgresql://node522-env-2323387.br1.saphir.global/dbReinf"/>-->
		<!-- <property name="javax.persistence.jdbc.user" value="webadmin" />-->
		<!-- <property name="javax.persistence.jdbc.password" value="DFMcfc57175" />-->
		
		

		<!-- propriedades do hibernate -->
		 <property name="hibernate.id.new_generator_mappings" value="false"/>
		 

		<property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect"/>
		<property name="hibernate.show_sql" value="true" />
		<property name="hibernate.format_sql" value="true" />
		<!-- <property name="hibernate.hibernate.cache.use_query_cache" value="true" />
		  <property name="hibernate.jdbc.wrap_result_sets" value="false" />
		   <property name="hibernate.use_sql_comments" value="false" /> --> 

		<!-- atualiza o banco, gera as tabelas se for preciso -->
		 <property name="hibernate.hbm2ddl.auto" value="update"/>

		 <!-- <property name="hibernate.hbm2ddl.auto" value="update"/> --> 
	
		
		</properties>

</persistence-unit>

Quando vc defne o <jta-data-source> vc informa pra JPA que ela deve procurar um recursos no servidor de aplicação registrado com o valor passado na propriedade. Esse valor é o nome JNDI do recurso.

Se vc usar essa opção, a aplicação vai proucurar um datasouce válido nos arquivos de configuração do servidor de aplicação (standalone.xml é um exemplo) ou buscar um arquivo com nome *-ds.xml que fica dentro da pasta de deployments do servidor. Outro ponto é que se vc usa esse recurso, não há necessidade de mapear os dados de conexão no persistence.xml, pois estes dados devem ser controlados pelo servidor.

Tendo em vista que mapeou os dados de conexão no persistence.xml, creio eu que vc não tem um datasource válido no servidor de aplicaçao com esse nome JNDI que vc passou como parâmetro.

Caso vc não queira criar esse datasouce, vc pode remover a tag da jta e alterar o transaction-type para “RESOURCE_LOCAL”.

1 curtida

Bom dia Raphel, sim, no meu arquivo standalone.xml tem o datasource com o mesmo nome que passei.

Sei que é meio antigo esse post, mas acho que posso ajudar. Crie um teste integrado através do Junit, e execute localmente, e se assegure que seu mapeamento objeto relacional funcione. Depois você adiciona o data-source, e testa com o servidor de aplicações. Fiz um tutorial sobre JPA, ele é simples, por favor, veja se ajuda.
Seguem os links:
http://www.tidicas.com.br/?p=1864
http://www.tidicas.com.br/?p=130
http://www.tidicas.com.br/?p=319