Método "editar" ñ atualiza, salva [Hibernate + Jsf]

10 respostas
T

Pessoal

Qnd eu clico em editar, ele carrega a tal tela p eu editar o que eu quero, e depois atualizar no banco. Mas ao inves de atualizar no banco, ele cria um novo registro no banco
com as informações novas ! Vou colar os códigos aqui p ver se vcs podem me ajudar…

Tela de edição com os dados carregados…

<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"                                                                                                                
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets">

<h:head>
	<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
	<title>Cadastro de Usuários</title>
</h:head>  
<h:body>  
    <h1>Cadastro de Usuários</h1>  
    <hr />  
    <h:form id="cadastro">                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               
        <h:messages />  
          <h:inputHidden value="#{usuarioBean.usuario.codigo}"/>
		  <h:inputHidden value="#{usuarioBean.usuario.ativo}"/>
		  <h:inputHidden value="#{usuarioBean.destinoSalvar}"/>
		  
         <h:panelGrid columns="2">  
            <h:outputLabel value="Nome:" for="nome" />  
            <h:inputText id="nome" label="Nome" value="#{usuarioBean.usuario.nome}" required="true" />  
            
            <h:outputLabel value="Matricula:" for="matricula"/>
            <h:inputText id="matricula" label="Matricula" value="#{usuarioBean.usuario.matricula}" required="true"/>
            
            
            <h:outputLabel value="Login" for="login" />
            <h:inputText id="login" label="login" value="#{usuarioBean.usuario.login}"/>
            
            <h:outputLabel value="Senha:" for="senha" />  
            <h:inputSecret id="senha" label="Senha" value="#{usuarioBean.usuario.senha}" required="true" /> 
             
           <h:outputLabel value="Confirmar Senha:" for="confirmarsenha"/>
		   <h:inputSecret id="confirmarsenha" label="Confirmar Senha" value="#{usuarioBean.confirmarSenha}" required="true" />
            
          
           
            <h:commandButton action="#{usuarioBean.salvar}" value="Salvar" />  
        </h:panelGrid>  
    </h:form>  
    <hr />  
</h:body>  
</html>

Tela do Bean

package requisicao.web;

import javax.faces.application.FacesMessage;
import javax.faces.bean.*;
import javax.faces.context.FacesContext;

import java.util.List;

import requisicao.usuario.*;

@ManagedBean(name = "usuarioBean")
@RequestScoped
public class UsuarioBean {

	private Usuario usuario = new Usuario();

	private String confirmarSenha;
	private List<Usuario> lista;
	private String destinoSalvar;
	
	
	public String novo() {
		this.destinoSalvar = "usuarioSucesso";
		this.usuario = new Usuario();
		this.usuario.setAtivo(true);
		return "usuario";
	}

	public String ativar() {
		if (this.usuario.isAtivo())
			this.usuario.setAtivo(false);
		else
			this.usuario.setAtivo(true);

		UsuarioRN usuarioRN = new UsuarioRN();
		usuarioRN.salvar(this.usuario);
		return null;
	}
	

	public String editar() {
		this.confirmarSenha = this.usuario.getSenha();
		return "/pages/publico/usuario";
	}
	
	public List<Usuario> getLista() {
		if (this.lista == null) {
			UsuarioRN usuarioRN = new UsuarioRN();
			this.lista = usuarioRN.listar();
		}
		return this.lista;
	}

	public String excluir() {
		UsuarioRN usuarioRN = new UsuarioRN();
		usuarioRN.excluir(this.usuario);
		this.lista = null;
		return null;
	}

	public String salvar() {
		FacesContext context = FacesContext.getCurrentInstance();

		String senha = this.usuario.getSenha();
		if (!senha.equals(this.confirmarSenha)) {
			FacesMessage facesMessage = new FacesMessage(
					"A senha não foi confirmada corretamente");
			context.addMessage(null, facesMessage);
			return null;
		}

		UsuarioRN usuarioRN = new UsuarioRN();
		usuarioRN.salvar(this.usuario);

		return "this.destinoSalvar";

	}

	public Usuario getUsuario() {
		return usuario;
	}

	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}

	public String getConfirmarSenha() {
		return confirmarSenha;
	}

	public void setConfirmarSenha(String confirmarSenha) {
		this.confirmarSenha = confirmarSenha;
	}

	public String getDestinoSalvar() {
		return destinoSalvar;
	}

	public void setDestinoSalvar(String destinoSalvar) {
		this.destinoSalvar = destinoSalvar;
	}

	public void setLista(List<Usuario> lista) {
		this.lista = lista;
	}
	
	

}

Obrigado =)

10 Respostas

H

Faça um debug e veja antes do alterar no banco se o objeto está com o ID preenchido.

T

Desculpa a ignorância, mas como faco o tal “debug” ?

H

Antes do método de update faça assim:
System.out.println(meuObjeto.getId());

H

Tem esse link que o digaoneves aqui do guj me passou:

http://www.vogella.com/articles/EclipseDebugging/article.html

É um debug mais profissa. =D

T

Desculpa a ignorância, mas como faco o tal “debug” ?

o metodo ficou assim:

public String editar() {
		System.out.println(usuario.getCodigo());
		this.confirmarSenha = this.usuario.getSenha();
		return "/pages/publico/usuario";
	}

O resultado no console foi “2”, que eh justamente o codigo do tal registro…

T

Outra coisa: Se eu quiser redirecionar a ação(depois que eu clicar em atualizar, o sistema abre tal pagina)
do botão p outra pagina eu tenho configurar (também) no faces-config né ?

T

Poxa pessoal, to empacado no projeto por causa disso…

Alguem tem nocao do q pode ser ?

valeu =)

T

E ai pessoal ?

Alguem pode me ajudar ? Ainda continuo com o mesmo problea…

E

Coloque na tela :

<h:inputText value="#{usuarioBean.usuario.codigo}" />

Veja se está chegando vazio / nulo.

A

Bom se não me engano esse exemplo e do livro Programação Java para WEB.

Como pode observar no seu codigo, vc esta salvando um novo registro porque vc esta chamando o metodo salvar na em sua tela de edição.

<h:commandButton action="#{usuarioBean.salvar}" value="Salvar" />

O livro acabou complicando a atualização do usuario devido usar o metodo Salvar para salvar e atualizar utilizando o mesmo formulario da página usuarioPublic.xhtml
o seu metodo editar na verdade ele apenas direciona para o formulario de edição com os campos preenchidos. Porque vc não faz um método atualizar no seu usuarioBean tipo.

public String atualizar() { UsuarioRN usuarioRN = new UsuarioRN(); usuarioRN.atualizar(this.usuario); this.lista = null; return null; }
ai vc chama este método no commandButton.

<h:commandButton action="#{usuarioBean.atualizar}" value="Salvar Aterações" />

na classe UsuarioRN vc adiciona.

public void atualizar(Usuario usuario) { this.usuarioDAO.atualizar(usuario); }

na sua classe UsuarioDAOHibernate deixe assim:

public void atualizar(Usuario usuario) { this.session.update(usuario); }
seu metodo editar que direciona a página para o formulário mudaria para.

public String editar() { this.confirmarSenha = this.usuario.getSenha(); return "/publico/atualizarUsuario";// página(atualizarUsuario.xhtml) que deve ser criada dentro da pasta public mundando apenas o metodo salvar para atualizar. } // ou se preferir coloque dentro da pasta admin alterando o return para return "/admin/atualizarUsuario"

Mais era para funcionar da forma que está, deve haver algum erro de codificação na sua classe UsuarioRN .

Criado 5 de setembro de 2012
Ultima resposta 13 de set. de 2012
Respostas 10
Participantes 4