Dúvida jsf- Remove do banco mas não da tela

4 respostas
R

Estou com um problema no jsF. Quando clico no link remover de um dataTable ele remove do banco, mas não da tela, na tela ele só remove quando eu clico outra vez… ou volto a mesma tela.

jsp

<%@taglib uri="http://java.sun.com/jsf/html" prefix="h"%><%@taglib
	uri="http://java.sun.com/jsf/core" prefix="f"%>
	<%@taglib uri="http://richfaces.org/rich" prefix="rich"%>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>

<f:view><h:form>
				Cargo:
		<h:selectOneMenu value="#{bTitulacao.cargoid}">
			<f:selectItems value="#{bCargo.listarCargos}"/>
		</h:selectOneMenu>
		<br>Titulação:<h:inputText value="#{bTitulacao.descricao}"></h:inputText><br>
		Pontos:<h:inputText value="#{bTitulacao.pontos}"></h:inputText><br>
		<h:commandButton value="Salvar" actionListener="#{bTitulacao.salvar}" onclick="submit();"></h:commandButton>
		<rich:dataTable id="listagemct" value="#{bTitulacao.cargosTitulacao}" var="ct" >
		<h:column id="cargo">
				<f:facet name="header">
					<h:outputText value="Cargo"></h:outputText>
				</f:facet>
				<h:outputText value="#{ct.cargo.descricao}"></h:outputText>
			</h:column>
			
		<h:column id="titulacao">
				<f:facet name="header">
					<h:outputText value="Titulação"></h:outputText>
				</f:facet>
				<h:outputText value="#{ct.titulacao.descricao}"></h:outputText>
		</h:column>	
		
		<h:column id="pontos">
				<f:facet name="header">
					<h:outputText value="Pontos"></h:outputText>
				</f:facet>
				<h:outputText value="#{ct.titulacao.pontos}"></h:outputText>
		</h:column>	
		
			<h:column id="remover">
				<f:facet name="header">
					<h:outputText value="Remover"></h:outputText>
				</f:facet>
					<h:commandLink actionListener="#{bTitulacao.deletar}" styleClass="link_geral" onclick="submit();" immediate="true">
				
				<h:outputText value="Remover"> </h:outputText>
				<f:param id="cargoTitulacaoid" value="#{ct.id}"/>
				</h:commandLink>
		</h:column>		
				
			
		</rich:dataTable>
		
	</h:form></f:view></body>
</html>

bean

package br.faetec.cadtemp.bean;

import java.util.ArrayList;
import java.util.List;

import javax.faces.component.UIParameter;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.faces.model.SelectItem;

import org.hibernate.Session;

import br.faetec.cadtemp.dao.Dao;
import br.faetec.cadtemp.hibernate.HibernateUtil;
import br.faetec.cadtemp.model.Cargo;
import br.faetec.cadtemp.model.Cargo_titulacao;
import br.faetec.cadtemp.model.Titulacao;

public class TitulacaoBean {

	Titulacao titulacao = new Titulacao();
	int cargoid;
	String descricao;
	int pontos;
	CargoTitulacaoBean ctBean= new CargoTitulacaoBean();
	List <Cargo_titulacao> cargosTitulacao = ctBean.listarCargosTitulacao();

	
	public List<Cargo_titulacao> getCargosTitulacao() {
		return cargosTitulacao;
	}

	public void setCargosTitulacao(List<Cargo_titulacao> cargosTitulacao) {
		this.cargosTitulacao = cargosTitulacao;
	}

	public int getPontos() {
		return pontos;
	}

	public void setPontos(int pontos) {
		this.pontos = pontos;
	}

	public String getDescricao() {
		return descricao;
	}

	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}

	public int getCargoid() {
		return cargoid;
	}

	public void setCargoid(int cargoid) {
		this.cargoid = cargoid;
	}
	
	public void salvar(ActionEvent ev){
		Cargo_titulacao ct= new Cargo_titulacao();
		
		String retorno=null;
		
		Session session= HibernateUtil.getSession();
		session= HibernateUtil.getSession();
		session.beginTransaction();
		
		Titulacao titulacao= new Titulacao();
		
		titulacao.setDescricao(descricao);
		titulacao.setPontos(pontos);
		
		new Dao<Titulacao>(session,Titulacao.class).adiciona(titulacao);
		session.getTransaction().commit();
		
		Cargo cargo= new Dao<Cargo>(session,Cargo.class).procura(cargoid);
		
		ct.setCargo(cargo);
		ct.setTitulacao(titulacao);
		
		new Dao<Cargo_titulacao>(session,Cargo_titulacao.class).adiciona(ct);
		
		//new Dao<Titulacao>(session,Titulacao.class).
		
		cargosTitulacao.add(ct);
		System.out.println("cadastro de titulacao efetuado com sucesso");
		System.out.println("Inseridos: "+ct.getCargo().getDescricao());
		session.close();
		

	}
	
	public void deletar(ActionEvent ev){
		
		
		FacesContext fc = FacesContext.getCurrentInstance();
		UIParameter parametroid = (UIParameter) ev.getComponent().findComponent("cargoTitulacaoid");
		int cargoTitulacaoid= Integer.parseInt(parametroid.getValue().toString());
		System.out.println("DELETANDO>>>"+cargoTitulacaoid);
		
		Session session= HibernateUtil.getSession();
		session= HibernateUtil.getSession();
		session.beginTransaction();
		
		
		Cargo_titulacao ct= new Dao<Cargo_titulacao>(session,Cargo_titulacao.class).procura(cargoTitulacaoid);
		
		
		int index = cargosTitulacao.indexOf(ct);
		
		
		



		cargosTitulacao.remove(ct);
		
		new Dao<Cargo_titulacao>(session,Cargo_titulacao.class).remove(ct);
		
		
		
		
		session.flush();
		session.close();
		

		
	}



	public Titulacao getTitulacao() {
		return titulacao;
	}

	public void setTitulacao(Titulacao titulacao) {
		this.titulacao = titulacao;
	}
	
	
}

Valeu ai a todos que ajudarem.

4 Respostas

tnaires

Resposta curta:
Implemente o método equals() na classe Cargo_titulacao. Retorne true quando as instâncias sendo comparadas possuírem o mesmo ID.

Resposta longa:
O método List.remove() pesquisa a instância a ser removida chamando sucessivamente o método equals() para cada uma das instâncias contidas na lista.
Se não for sobrescrito corretamente, o método equals() retorna true sempre que duas instâncias possuírem a mesma referência na memória.
No método deletar, você está criando outra instância de Cargo_titulacao com o mesmo ID. O método List.remove() tenta encontrar a instância, porém como são objetos diferentes ela não é encontrada. Para que funcione, você precisa sobrescrever o método equals() da classe Cargo_titulacao para retornar true sempre que as instâncias possuírem o mesmo ID.

R

Tem algum exemplo de como fazer isso? Não conheço como implementar esse método.

mgarcia

O Eclipse implementa esse método pra vc…
abra a classe e vá em Sources -> Generate hash code and equals…

R

Fiz o que vocês mandaram… reescrevi o método através do eclipse e funcionou direitinho :smiley:

Obrigado mesmo.

Criado 8 de julho de 2010
Ultima resposta 8 de jul. de 2010
Respostas 4
Participantes 3