Problema com JSF + Auto-relacionamento Hibernate, não salva ContaPai

4 respostas
ibotirama

Oi, tenho o seguinte problema (Onde contaPai) não está gravando e não mensagem alguma de erro :

Alguém poderia me ajudar a descobrir o que se passa, eu estou usando o Glassfish 3.1, NetBeans 6.9, Mojarra 2.0.4, Primefaces 2.2, Springframework 3.0.5, Hibernate 3.0.6 Final

package com.fazsaofrancisco.agritech.model;

import java.io.Serializable;
import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

/**
 * @author Pedro Henrique
 * @since 09/01/2011
 */

@Entity
public class CentroCusto implements Serializable{

	private static final long serialVersionUID = 8346008071112411471L;
	@Id
	@Column(length=20)
	private String codigo;
    private String descricao;
    @ManyToOne(fetch = FetchType.EAGER)
    private CentroCusto contaPai;
    private boolean aceitaLanctos;
    @Temporal(value = TemporalType.DATE)
    private Date dataCadastro;
    private boolean unidadeNegocio;
    
    public CentroCusto() {

    }
	public void setCodigo(String codigo) {
		this.codigo = codigo;
	}
	public String getCodigo() {
		return codigo;
	}
	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}
	public String getDescricao() {
		return descricao;
	}
	public void setContaPai(CentroCusto contaPai) {
		if (this.contaPai == null)
			this.contaPai = new CentroCusto();
		this.contaPai = contaPai;
	}
	public CentroCusto getContaPai() {
		return contaPai;
	}
	public boolean isAceitaLanctos() {
		return aceitaLanctos;
	}
	public void setAceitaLanctos(boolean aceitaLanctos) {
		this.aceitaLanctos = aceitaLanctos;
	}
	public Date getDataCadastro() {
		return dataCadastro;
	}
	public void setDataCadastro(Date dataCadastro) {
		this.dataCadastro = dataCadastro;
	}
	public boolean isUnidadeNegocio() {
		return unidadeNegocio;
	}
	public void setUnidadeNegocio(boolean unidadeNegocio) {
		this.unidadeNegocio = unidadeNegocio;
	}
	@Override
	public String toString() {
		return "CentroCusto [codigo=" + codigo + ", descricao=" + descricao
				+ ", contaPai=" + contaPai + ", aceitaLanctos=" + aceitaLanctos
				+ ", dataCadastro=" + dataCadastro + ", unidadeNegocio="
				+ unidadeNegocio + "]";
	}
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + (aceitaLanctos ? 1231 : 1237);
		result = prime * result + ((codigo == null) ? 0 : codigo.hashCode());
		result = prime * result
				+ ((contaPai == null) ? 0 : contaPai.hashCode());
		result = prime * result
				+ ((dataCadastro == null) ? 0 : dataCadastro.hashCode());
		result = prime * result
				+ ((descricao == null) ? 0 : descricao.hashCode());
		result = prime * result + (unidadeNegocio ? 1231 : 1237);
		return result;
	}
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		CentroCusto other = (CentroCusto) obj;
		if (aceitaLanctos != other.aceitaLanctos)
			return false;
		if (codigo == null) {
			if (other.codigo != null)
				return false;
		} else if (!codigo.equals(other.codigo))
			return false;
		if (contaPai == null) {
			if (other.contaPai != null)
				return false;
		} else if (!contaPai.equals(other.contaPai))
			return false;
		if (dataCadastro == null) {
			if (other.dataCadastro != null)
				return false;
		} else if (!dataCadastro.equals(other.dataCadastro))
			return false;
		if (descricao == null) {
			if (other.descricao != null)
				return false;
		} else if (!descricao.equals(other.descricao))
			return false;
		if (unidadeNegocio != other.unidadeNegocio)
			return false;
		return true;
	}
}

DAO

package com.fazsaofrancisco.agritech.dao;

import java.util.List;

import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import org.springframework.stereotype.Repository;

import com.fazsaofrancisco.agritech.helper.Util;
import com.fazsaofrancisco.agritech.model.CentroCusto;

@Repository("centroCustoDAO")
@Scope("singleton")
public class CentroCustoDAOImpl extends HibernateDaoSupport implements CentroCustoDAO{
	private static final long serialVersionUID = 5324240665664157506L;

	@Autowired
	public CentroCustoDAOImpl(SessionFactory sessionFactory) {
		super();
		setSessionFactory(sessionFactory);
	}

	public void store(CentroCusto object) {
		try {
			object.setDataCadastro(Util.DataAtual());
			getHibernateTemplate().saveOrUpdate(object);
		} catch (Exception e) {
			throw new DAOServiceException("Erro ao gravar : " + object, e);
		}
	}

	public void remove(CentroCusto object) {
		try {
			getHibernateTemplate().delete(object);
		} catch (Exception e) {
			throw new DAOServiceException("Erro ao apagar : " + object, e);
		}
	}

	public CentroCusto findByPrimaryKey(Long pk) {
		CentroCusto grp;
		try {
			grp = getHibernateTemplate().load(CentroCusto.class, pk);
		} catch (Exception e) {
			throw new DAOServiceException(
					"Erro ao tentar localizar "+this.getClass().getName()+" pela pk : " + pk, e);
		}
		return grp;
	}

	public CentroCusto findByDescricao(String d) {
		CentroCusto grp = null;
		try {
			grp = (CentroCusto) getHibernateTemplate().findByNamedQueryAndNamedParam("consultaPorDescricao", "descri", d).get(0);
		} catch (Exception e) {
			throw new DAOServiceException("Erro ao tentar localizar "+this.getClass().getName()+" pela Descricao : " + d, e);
		}
		return grp;
	}
	
	public List<CentroCusto> loadAll() {
		List<CentroCusto> lista = null;
		try {
			lista = (List<CentroCusto>) getHibernateTemplate().loadAll(CentroCusto.class);
		} catch (Exception e) {
			throw new DAOServiceException(
					"Erro ao tentar retornar todos os registros de "+this.getClass().getName()+".", e);
		}
		return lista;
	}

	@Override
	public CentroCusto findByPrimaryKey(String pk) {
		CentroCusto cc;
		try {
			cc = getHibernateTemplate().load(CentroCusto.class, pk);
		} catch (Exception e) {
			throw new DAOServiceException(
					"Erro ao tentar localizar "+this.getClass().getName()+" pela pk : " + pk, e);
		}
		return cc;
	}
}

ManagedBean

package com.fazsaofrancisco.agritech.controller;

import java.io.Serializable;
import java.util.List;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

import com.fazsaofrancisco.agritech.dao.CentroCustoDAO;
import com.fazsaofrancisco.agritech.helper.JSFUtil;
import com.fazsaofrancisco.agritech.helper.Util;
import com.fazsaofrancisco.agritech.model.CentroCusto;

@Controller("centroCustoMB")
@Scope("view")
public class CentroCustoMB implements ControllerService, Serializable {
	private static final long serialVersionUID = -3240355618051465436L;
	private static final Logger log = Logger.getLogger(CentroCustoMB.class);

	private CentroCustoDAO centroCustoDAO;
	private CentroCusto obj;
	private List<CentroCusto> lista;
	
	@Autowired
	public CentroCustoMB(CentroCustoDAO centroCustoDAO){
		this.centroCustoDAO = centroCustoDAO;
		this.atualizaTela();
	}

	public CentroCusto getObj() {
		return obj;
	}

	public void setObj(CentroCusto obj) {
		this.obj = obj;
	}

	public List<CentroCusto> getLista() {
		return lista;
	}

	public void setLista(List<CentroCusto> lista) {
		this.lista = lista;
	}
	
	public List<CentroCusto> getCentrosCusto(){
		return centroCustoDAO.loadAll();
	}

	@Override
	public String inserir() {
    	log.info("Inserindo :"+obj);
        atualizaTela();
        return "centrocusto/form.xhtml";
	}

	@Override
	public void salvar() {
        try {
        	log.info("Salvando  :"+obj);
        	centroCustoDAO.store(obj);
            JSFUtil.addMessage(obj.getDescricao() + ", salvo com sucesso !", "Operação bem sucedida ! " + obj);
            atualizaTela();
        } catch (Exception e) {
            JSFUtil.addMessageErro("Erro ao tentar incluir : " + obj);
        }
	}

	@Override
	public void apagar() {
        try{
        	log.info("--------------> Apagando :"+obj);
            centroCustoDAO.remove(getObj());
            JSFUtil.addMessage(obj.getDescricao()+", apagado com sucesso !" , "Operação bem sucedida !" + obj);
            atualizaTela();
        }
        catch (Exception e){
            JSFUtil.addMessageErro("Erro ao tentar apagar : " + obj);
        }
	}

	@Override
	public void atualizaTela() {
		log.info("--------------> Atualizar a tela ");
		this.obj = new CentroCusto();
		// Está sendo feito aqui pois se fosse feito no modelo ao criar geraria recursividade.
		//this.obj.setContaPai(new CentroCusto()); 
		this.lista = centroCustoDAO.loadAll();
	}

	@Override
	public CentroCusto getNovo() {
		CentroCusto cc = new CentroCusto();
		cc.setDataCadastro(Util.DataAtual());
		return cc;
	}
	
	public void teste(){
		CentroCusto c = new CentroCusto();
		c.setCodigo("01.10.10");
		c.setDescricao("CC de teste automatizado");
		CentroCusto cPai = centroCustoDAO.findByPrimaryKey("01"); 
		c.setContaPai(cPai);
		c.setAceitaLanctos(true);
		
		centroCustoDAO.store(c);
	}

}

View

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
	xmlns:h="http://java.sun.com/jsf/html"
	xmlns:p="http://primefaces.prime.com.tr/ui"
	xmlns:f="http://java.sun.com/jsf/core">
<h:head>
	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
	<title>#{msgs.centroscusto}</title>
</h:head>
<h:body>
	<h:form id="frmPrincipal">
		<p:growl id="growl" />
		<p:panel id="Painel" header="#{msgs.centroscusto}">
			<p:focus for="iCCCodigo"/>
			<h:panelGrid columns="2">
				<h:outputText id="iCCCodigo"  value="#{msgs['centroscusto.codigo']}" />
				<p:inputMask  value="#{centroCustoMB.obj.codigo}" mask="99.99.99.99" required="true" label="Código" />
				<h:outputText value="#{msgs['centroscusto.descricao']}" />
				<h:inputText value="#{centroCustoMB.obj.descricao}"  required="true" label="Descrição"/>
				<h:outputText value="#{msgs['centroscusto.contapai']}" />
				<h:selectOneMenu value="#centroCustoMB.obj.contaPai.codigo" >
					<f:selectItem />
					<f:selectItems value="#{centroCustoMB.centrosCusto}" var="c" itemValue="#{c.codigo}" itemLabel="#{c.codigo} : #{c.descricao}"/>
				</h:selectOneMenu>
				<h:outputText value="#{msgs['centroscusto.datacadastro']}" />
   			    <p:calendar value="#{centroCustoMB.obj.dataCadastro}" disabled="true"/> 
				<h:outputText value="#{msgs['centroscusto.aceitalancamentos']}" />
				<h:selectBooleanCheckbox value="#{centroCustoMB.obj.aceitaLanctos}" />
			</h:panelGrid>
		</p:panel>
		<p:panel id="toolbar">
			<h:panelGrid columns="2">
				<p:commandButton value="Salvar" action="#{centroCustoMB.salvar}" update="frmPrincipal" image="ui-icon-disk" />
				<p:commandButton value="Cancelar" action="#{indexController.setCentrosCustoList}" update="frmPrincipal" image="ui-icon-cancel" />
			</h:panelGrid>
		</p:panel>

	</h:form>
</h:body>
</html>

4 Respostas

luxu

mas o q acontece? kd o erro? o nd disso?

ibotirama

Não grava a campo ContaPai, mostra vários campos entre eles ContaPai que é um auto-relacionamento de CentroCusto porém ele simplesmente não grava, eu seleciono no combo e quando clico em Salvar, grava todos os outros campos, menos ele.
:cry:

luxu

bom tive esse problema mas no meu caso tinha um selectItem de cidades...

<h:selectOneMenu id="selectCidade"	value="#{alunoBean.cid_Codigo}"
		 		title="Selecione uma cidade"  disabled="#{not empty cityBean.codigoCidade}">
<f:selectItems value="#{entradaAlunosBBean.cidades}" id="aluno-cidade"/>
</h:selectOneMenu >
e precisava pegar o ID dela...fiz isso e resolveu:
private int cid_Codigo;

public void salvarAluno(){
	InterfaceDAO<Aluno> alunoDAO = new HibernateDAO<Aluno>(Aluno.class, FacesContextUtil.getRequestSession());
	Cidade cidade = new Cidade();
	cidade.setCodigo(this.getCid_Codigo());
	this.getAluno().setCidade(cidade);
        alunoDAO.salvar(aluno);
}
v se entende o q eu fiz...
ibotirama

Se eu entendi bem é o mesmo que fazer isso né :

&lt;h:outputText value="Grupo" /&gt;
                                &lt;h:selectOneMenu id="iGrupo" value="#{produtoMB.prod.grupo.id}"&gt;
                                    &lt;f:selectItem /&gt;
                                    &lt;f:selectItems value="#{produtoMB.grupos}" var="g" itemValue="#{g.id}" itemLabel="#{g.descricao}"/&gt;
                                &lt;/h:selectOneMenu&gt;

Que eu faço no cadastro de produtos, mas não funciona com o CentroCusto, agora eu notei o seguinte, quando eu inicio o Model de Produto(construtor), eu dou new em Grupo, o mesmo eu não faço em contaPai de CentroCusto, pois gera uma recursividade(StackOverFlow), será que é isso ???, neste meio tempo tentei criar um converter, mas tb não deu certo, no getAsString o parâmetro Object só vem null, eitra trenzim zicado rs.
:cry:

Criado 10 de fevereiro de 2011
Ultima resposta 11 de fev. de 2011
Respostas 4
Participantes 2