Problema com ID [Resolvido]

8 respostas
Eduardo_Bregaida

Pessoal estou com o seguinte problema:
Recupero o Id pra alterar, mas ele ta retornando null…

JSP:
<h:commandLink actionListener="#{DadosHandler.carregaDados}">
<h:outputText value="Alterar" styleClass="A"/>
<f:param id="editId" name="id" value="#{d.id}"/>

Meu Handler:
public void carregaDados(ActionEvent event) {
		UIComponent comandLink = event.getComponent();
		UIParameter parameter = (UIParameter) comandLink
				.findComponent("editId");
		Long id = (Long) parameter.getValue();
		Session session = HibernateUtil.getCurrentSession();
		DAO<Dados> dao = new DAO<Dados>(session, Dados.class);
		this.dados = dao.load(id);


	}
//Esse aí em cima funciona

public void salvarDados() {

		Session session = HibernateUtil.getCurrentSession();
		DAO<Dados> dao = new DAO<Dados>(session, Dados.class);
		if(dados.getId()==null){
		dao.salveOuAtualiza(this.dados);
		}else{
			session.merge(this.dados);
		}
		this.dados = new Dados();

	}
//Esse aki em cima ta retornando null e salvando


DAO
@SuppressWarnings("unchecked")
	public void salveOuAtualiza(T t) {
		session.saveOrUpdate(t);
	}

8 Respostas

otaviofcs
Heero Yuy:
public void salvarDados() {

		Session session = HibernateUtil.getCurrentSession();
		DAO<Dados> dao = new DAO<Dados>(session, Dados.class);
		if(dados.getId()==null){
		dao.salveOuAtualiza(this.dados);
		}else{
			session.merge(this.dados);
		}
		this.dados = new Dados();

	}

Olá Heero,

Tá meio misturado mas vou tentar ajudar. O seu salveOuAtualiza deveria retornar o objeto Dados. Quando você dá um :

this.dados = new Dados();

No final do método, um objeto Dados() novo é carregado e esse deve possuir id = null;

Aliás, se seu método se chama salvaOuAtualiza ele deveria tratar o fato do id ser nulo. Imagino algo como:

public void salvarDados() {

		Session session = HibernateUtil.getCurrentSession();
		DAO<Dados> dao = new DAO<Dados>(session, Dados.class);
		if(dados.getId()==null){
		        this.dados = dao.salve(this.dados);
		}else{
			session.merge(this.dados);
		}
	}

espero ter ajudado....

Eduardo_Bregaida
otaviofcs:
Heero Yuy:
public void salvarDados() {

		Session session = HibernateUtil.getCurrentSession();
		DAO<Dados> dao = new DAO<Dados>(session, Dados.class);
		if(dados.getId()==null){
		dao.salveOuAtualiza(this.dados);
		}else{
			session.merge(this.dados);
		}
		this.dados = new Dados();

	}

Olá Heero,

Tá meio misturado mas vou tentar ajudar. O seu salveOuAtualiza deveria retornar o objeto Dados. Quando você dá um :

this.dados = new Dados();

No final do método, um objeto Dados() novo é carregado e esse deve possuir id = null;

Aliás, se seu método se chama salvaOuAtualiza ele deveria tratar o fato do id ser nulo. Imagino algo como:

public void salvarDados() {

		Session session = HibernateUtil.getCurrentSession();
		DAO<Dados> dao = new DAO<Dados>(session, Dados.class);
		if(dados.getId()==null){
		        this.dados = dao.salve(this.dados);
		}else{
			session.merge(this.dados);
		}
	}

espero ter ajudado....

N era isso não, ainda vem null, esse
this.dados = new Dados();

é para não trazer os dados q eu acabei de digitar nos meus campos (O JSF deixa os dados nos inputs) dai ele vem em branco p/ novo cadastro, o evento q eu trato é p/ ele pegar do banco e carregar nos inputs e o salveOuUpdate (nome horrivel q eu dei) é p/ atualizar, mas nisso dele carregar o cara e eu modificar, qdo clico no salvar ele perde o id dai vem null e ele insere 1 novo :D

Entendeu oq ta acontecendo? pior q tá igual outro q eu fiz e funciona...

Deve ser um erro estupido q n to vendo...

Eduardo_Bregaida

Meu código esta dividido assim:

JSF:

<h:commandButton value="Gravar" action="#{DadosHandler.salvarDados}" styleClass="BUTTON_imagem"/>


e

<h:column>
												<f:facet name="header">
													<h:outputText value="Alterar" styleClass="titulo_campos"/>
												</f:facet>
												<h:commandLink actionListener="#{DadosHandler.carregaDados}">
													<h:outputText value="Alterar" styleClass="A"/>
													<f:param id="editId" name="id" value="#{d.id}"/>
												</h:commandLink>
											</h:column>

Meu DadosHandler:

public void carregaDados(ActionEvent event) {
		UIComponent comandLink = event.getComponent();
		UIParameter parameter = (UIParameter) comandLink
				.findComponent("editId");
		Long id = (Long) parameter.getValue();
		Session session = HibernateUtil.getCurrentSession();
		DAO<Dados> dao = new DAO<Dados>(session, Dados.class);
		this.dados = dao.load(id);

	}




e


public void salvarDados() {

		Session session = HibernateUtil.getCurrentSession();
		DAO<Dados> dao = new DAO<Dados>(session, Dados.class);
		if (dados.getId() == null) {
			System.out.println("id" + dados.getId());
			dao.salveOuAtualiza(this.dados);
		} else {
			session.merge(this.dados);
		}
		this.dados = new Dados();

	}

Meu DAO:

@SuppressWarnings("unchecked")
	public void salveOuAtualiza(T t) {
		session.saveOrUpdate(t);
	}

Basicamente, eu pego o ID q ta na tabela (dentro do JSF), mando pro Handler as alterações e ele manda p/ o DAO, mas está indo null p/ o Handler.

:cry:

otaviofcs

Cara, tá brabo de ver os fragmentos de código e junta-los na cabeça :shock:

Mas vamos tentar uma coisa: o seu carregaDados sempre busca o valor do campo do seu formulário. só que eu não tô vendo você ter o id preenchido no formulário (porque ele sempre está pra inclusão). Então, se o id é sempre vazio (nulo), ele nunca vai ter como dar o carregaDados.

Vê se eu falei besteira, porque tá difícil sem ver por inteiro…

abraços,

otávio

Eduardo_Bregaida

O Id Retorna depois q clico no link Alterar, vou postar o codigo todo, acho q facilita, pq ta osso resolver isso =)

DAO:
package br.com.imes.dao;


import java.util.List;

import org.apache.log4j.Logger;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;

import br.com.imes.dados.Dados;

/**
 * @author wav138
 *
 */
public class DAO<T> {
	// T = Type ou seja tipo
	private Session session;

	private Logger logger = Logger.getLogger(DAO.class);

	// criado p/ pegar a classe q vai no método load e generics q nao permite
	// chamar atributos e metodos
	private Class classe;

	public DAO(Session session, Class classe) {
		this.session = session;
		this.classe = classe;
	}


	@SuppressWarnings("unchecked")
	public void save(T t) {
		logger.info("salvando " + t);
		session.save(t);
	}

	@SuppressWarnings("unchecked")
	public T load(Long id) {
		logger.info("lendo " + classe + " id: "+id);
		return (T) session.load(classe, id);
	}

	@SuppressWarnings("unchecked")
	public void salveOuAtualiza(T t) {
		session.saveOrUpdate(t);
	}

	public void deleta(T t) {
		logger.info("deletando " + t);
		session.delete(t);
	}

	@SuppressWarnings("unchecked")
	public List<T> list() {
		// Critéria API
		Criteria criteria = getSession().createCriteria(classe);
		return criteria.list();
	}

//	 Criado p/ as outras classes conseguirem ver
	public Session getSession() {
		return session;
	}

	public void setSession(Session session) {
		this.session = session;
	}


	@SuppressWarnings("unchecked")
	public List<String> buscaNome(String buscaNome){
		Criteria criteria = session.createCriteria(Dados.class);
		criteria.add(Restrictions.ilike("nome", buscaNome + "%"));
		criteria.addOrder(Order.asc("nome"));
		criteria.setProjection(Projections.property("nome"));
		return criteria.list();


	}
}
Dados:
/**
 *
 */
package br.com.imes.dados;

import java.util.Calendar;
import java.util.GregorianCalendar;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.OneToMany;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

import br.com.imes.acesso.Acesso;

/**
 * @author OTTA956
 *
 */
@Entity
public class Dados {
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Long id;

	private String nome;

	private String telefoneResidencial;

	private String telefoneComercial;

	private String celular;

	private String nextel;

	private String email;

	private String observacao;

	@Temporal(TemporalType.DATE)
	private Calendar data = new GregorianCalendar();





	public Calendar getData() {
		return data;
	}

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

	public String getNome() {
		return nome;
	}

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

	public Long getId() {
		return id;
	}

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

	public String getCelular() {
		return celular;
	}

	public void setCelular(String celular) {
		this.celular = celular;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public String getNextel() {
		return nextel;
	}

	public void setNextel(String nextel) {
		this.nextel = nextel;
	}

	public String getObservacao() {
		return observacao;
	}

	public void setObservacao(String observacao) {
		this.observacao = observacao;
	}

	public String getTelefoneComercial() {
		return telefoneComercial;
	}

	public void setTelefoneComercial(String telefoneComercial) {
		this.telefoneComercial = telefoneComercial;
	}

	public String getTelefoneResidencial() {
		return telefoneResidencial;
	}

	public void setTelefoneResidencial(String telefoneResidencial) {
		this.telefoneResidencial = telefoneResidencial;
	}

}
DadosHandler:
package br.com.imes.dadoshandler;

import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.component.UIParameter;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.faces.validator.ValidatorException;

import org.hibernate.Session;

import br.com.imes.dados.Dados;
import br.com.imes.dao.DAO;
import br.com.imes.hibernate.hibernateutil.HibernateUtil;

public class DadosHandler {

	private Dados dados = new Dados();

	public List<String> suggest(String buscaNome) {
		Session session = HibernateUtil.getCurrentSession();
		DAO<Dados> dao = new DAO<Dados>(session, Dados.class);
		return dao.buscaNome(buscaNome);

	}

	public Dados getDados() {
		return dados;
	}

	public void setDados(Dados dados) {
		this.dados = dados;
	}

	public List<Dados> getDados2() {
		Session session = HibernateUtil.getCurrentSession();
		DAO<Dados> dao = new DAO<Dados>(session, Dados.class);
		return dao.list();
	}

	public void salvarDados() {

		Session session = HibernateUtil.getCurrentSession();
		DAO<Dados> dao = new DAO<Dados>(session, Dados.class);
		if (dados.getId() == null) {
			System.out.println("id" + dados.getId());
			dao.salveOuAtualiza(this.dados);
		} else {
			session.merge(this.dados);
		}
		this.dados = new Dados();

	}

	public void deletarDados() {

		Session session = HibernateUtil.getCurrentSession();
		DAO<Dados> dao = new DAO<Dados>(session, Dados.class);
		if (dados.getId() == null) {
			dao.deleta(this.dados);
		} else {
			session.merge(this.dados);
		}
		this.dados = new Dados();

	}

	public void carregaDados(ActionEvent event) {
		UIComponent comandLink = event.getComponent();
		UIParameter parameter = (UIParameter) comandLink
				.findComponent("editId");
		Long id = (Long) parameter.getValue();
		Session session = HibernateUtil.getCurrentSession();
		DAO<Dados> dao = new DAO<Dados>(session, Dados.class);
		this.dados = dao.load(id);

	}

}
Agenda.jsp, o JSF
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
<%@ taglib uri="http://myfaces.apache.org/tomahawk" prefix="t" %>
<%@ taglib uri="http://myfaces.apache.org/sandbox" prefix="s" %>

<html>
	<head>
		<link href="css/master.css" rel="stylesheet" type="text/css">
		<link href="../css/master.css" rel="stylesheet" type="text/css">
		<meta http-equiv="Content-Type" content="text/html; charset=Cp1252"/>
		<title>Agenda</title>
	
	</head>
	<body>		
		<f:view> 
		<center>
			Agenda Web
			<t:panelTabbedPane bgcolor="0071e1"  styleClass="ML_BACKGROUND"  width="30%">
				<t:panelTab label="Dados" >
								<h:form>
								<t:panelGrid>
									<h:outputText value="Nome:" styleClass="titulo_campos"/> <h:inputText value="#{DadosHandler.dados.nome}"required="true"/>
									<h:outputText value="Tel:" styleClass="titulo_campos"/> <h:inputText value="#{DadosHandler.dados.telefoneResidencial}"required="false"/>
									<h:outputText value="Tel Com.:" styleClass="titulo_campos"/> <h:inputText value="#{DadosHandler.dados.telefoneComercial}"required="false"/>
									<h:outputText value="Cel::" styleClass="titulo_campos"/> <h:inputText value="#{DadosHandler.dados.celular}"required="false"/>
									<h:outputText value="Nextel:" styleClass="titulo_campos"/> <h:inputText value="#{DadosHandler.dados.nextel}"required="false"/>
									<h:outputText value="E-mail:" styleClass="titulo_campos"/> <h:inputText value="#{DadosHandler.dados.email}"required="false"/>
									<h:outputText value="Observação:" styleClass="titulo_campos"/> <h:inputTextarea value="#{DadosHandler.dados.observacao}" required="true" styleClass="TEXTAREA"/>
									<h:commandButton value="Gravar" action="#{DadosHandler.salvarDados}" styleClass="BUTTON_imagem"/>
									<h:commandButton value="Excluir" action="#{DadosHandler.deletarDados}" styleClass="BUTTON_imagem"/>
								</t:panelGrid>
								</h:form>
								<h:form>
								
			
										<h:dataTable styleClass="TableWhite" value="#{DadosHandler.dados2}" id="tabelaDados" rows="5" var="d" border="1" rendered="#{not empty DadosHandler.dados2}">
											<h:column>
												<f:facet name="header">
													<h:outputText value="ID" styleClass="titulo_campos"/>
												</f:facet>
												<h:outputText value="#{d.id}" styleClass="titulo_campos"/>
											</h:column>
											<h:column>
												<f:facet name="header">
													<h:outputText value="Nome" styleClass="titulo_campos"/>
												</f:facet>
												<h:outputText value="#{d.nome}" styleClass="titulo_campos"/>
											</h:column>
											<h:column>
												<f:facet name="header">
													<h:outputText value="Telefone Res." styleClass="titulo_campos"/>
												</f:facet>
												<h:outputText value="#{d.telefoneResidencial}" styleClass="titulo_campos"/>
											</h:column>
											<h:column>
												<f:facet name="header">
													<h:outputText value="Telefone Com." styleClass="titulo_campos"/>
												</f:facet>
												<h:outputText value="#{d.telefoneComercial}" styleClass="titulo_campos"/>
											</h:column>
											<h:column>
												<f:facet name="header">
													<h:outputText value="Celular." styleClass="titulo_campos"/>
												</f:facet>
												<h:outputText value="#{d.celular}" styleClass="titulo_campos"/>
											</h:column>
											<h:column>
												<f:facet name="header">
													<h:outputText value="Nextel" styleClass="titulo_campos"/>
												</f:facet>
												<h:outputText value="#{d.nextel}" styleClass="titulo_campos"/>
											</h:column>
											<h:column>
												<f:facet name="header">
													<h:outputText value="E-mail" styleClass="titulo_campos"/>
												</f:facet>
												<h:outputText value="#{d.email}" styleClass="titulo_campos"/>
											</h:column>
											<h:column>
												<f:facet name="header">
													<h:outputText value="Observação" styleClass="titulo_campos"/>
												</f:facet>
												<h:outputText value="#{d.observacao}" styleClass="titulo_campos"/>
											</h:column>
											<h:column>
												<f:facet name="header">
													<h:outputText value="Alterar" styleClass="titulo_campos"/>
												</f:facet>
												<h:commandLink actionListener="#{DadosHandler.carregaDados}">
													<h:outputText value="Alterar" styleClass="A"/>
													<f:param id="editId" name="id" value="#{d.id}"/>
												</h:commandLink>
											</h:column>
										</h:dataTable>
										<t:dataScroller for="tabelaDados" paginator="true" paginatorMaxPages="7" styleClass="A"></t:dataScroller>
										
										<h:outputText value="Teste Ajax em JSF" styleClass="titulo_campos"/>
										<s:inputSuggestAjax suggestedItemsMethod="#{DadosHandler.suggest}"></s:inputSuggestAjax>
										
											<h:outputText value="Calendário em JSF" styleClass="titulo_campos"/>
										<t:inputCalendar renderAsPopup="true" value="#{DadosHandler.dados.data.time}"/>
								
										
								</h:form>
				</t:panelTab>
			</t:panelTabbedPane>
			</center>
		</f:view>
	</body>
</html>

É isso o código é q tá grande :D

Eduardo_Bregaida

Alguem ai conseguiu ver o problema? Ta osso esse ai :cry:

Eduardo_Bregaida

Ninguém? :cry:

Eduardo_Bregaida

Resolvi, o erro é q o amateras não atualiza o faces-config, logo qdo mudei p/ session, ele nao atualizou o xml, só a interface gráfica do plugin no Eclipse :smiley:

Q droga, erro do plugin q perdi mto tempo :smiley:

Criado 5 de junho de 2007
Ultima resposta 13 de jun. de 2007
Respostas 8
Participantes 2