Problema para alterar e excluir [Resolvido]

8 respostas
W

Amigos, tô com dois problemas na minha aplicação. Um é em relação a exclusão e o outro é na alteração.
Se eu mando excluir o primeiro usuário ele exclui sem problema, mas se mando do segundo em diante não dá erro, mas também não exclui.
Na alteração também não dá erro, mas não altera, já nesse caso nem altera o primeiro nem os demais usuários. Estou usando jsf e jpa.
Segue as classes UsuarioRepositorio.java; UsuarioBean.java, CaastroUsuarioService.java e o código que faz a listagem do usuário e o que recebe os dados do usuário , após clicar no botão alterar, para realizar as alterações. Se alguém puder me ajudar, Desde já agradeço.

package com.gugawag.projeto.repositorio;

import java.util.List;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import com.gugawag.projeto.modelo.Usuario;

@Stateless
public class UsuarioRepositorio {
	
	@PersistenceContext
	private EntityManager em;
	
	public void cadastrarUsuario(Usuario usuario){
		em.persist(usuario);
	}
	
	public void removerUsuario(Usuario usuario){
		usuario = em.merge(usuario);
		em.remove(usuario);
	}
	
	@SuppressWarnings("unchecked")
	public List<Usuario> getUsuarios(){
		return em.createQuery("from Usuario").getResultList();
	}
	
	public void atualizar(Usuario usuario) {
		em.merge(usuario);
	}
	
	@SuppressWarnings("unchecked")
	public Usuario getUsuarioPorLogin(String login){
		List<Usuario> usuarios = em.createQuery("from Usuario u where u.login=:login").setParameter("login", login).getResultList();
		if (usuarios != null && usuarios.size()>0){
			return usuarios.get(0);
		}
		return null;
	}

}

package com.gugawag.projeto.beans;

import java.util.List;

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

import com.gugawag.projeto.modelo.Usuario;
import com.gugawag.projeto.repositorio.UsuarioRepositorio;
import com.gugawag.projeto.service.CadastroUsuarioService;
import com.gugawag.projeto.service.UsuarioJahCadatradoException;

@ManagedBean
@SessionScoped
public class UsuarioBean{
	
	private Usuario usuario;
	
	public UsuarioBean(){
		usuario = new Usuario();
	}
	
	@EJB
	private CadastroUsuarioService usuarioService;
	
	@EJB
	private UsuarioRepositorio usuarioRepositorio;
	
	public Usuario getUsuario() {
		return usuario;
	}

	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}
	
	
	
	public List<Usuario> getUsuarios(){
		return usuarioService.getUsuarios();
	}

	public String editar(Usuario usuario){
		this.usuario = usuario;
		return "editarUsuario";
	}
	
	public String editar(){
		usuarioRepositorio.atualizar(usuario);
		return "listagemUsuarios";
	}

	public String cadastrar(){
		try {
			usuarioService.cadastrarUsuario(usuario);
			usuario = new Usuario();
			Util.acrescentaMensagem("usuario.cadastrosucesso", new String[]{usuario.getLogin()});
			
		} catch (UsuarioJahCadatradoException e) {
			Util.acrescentaMensagem("usuario.usuariojahcadastrado", new String[]{usuario.getLogin()});
			
		}
		return null;
	}
	
	public String remover(Usuario usuario){
		usuarioRepositorio.removerUsuario(usuario);
		return null;
	}
		
}



package com.gugawag.projeto.service;

import java.util.List;

import javax.ejb.EJB;
import javax.ejb.Stateless;

import com.gugawag.projeto.modelo.Usuario;
import com.gugawag.projeto.repositorio.UsuarioRepositorio;

@Stateless
public class CadastroUsuarioService {
	
	@EJB
	private UsuarioRepositorio usuarioRepositorio;

	public void cadastrarUsuario(Usuario usuario) throws UsuarioJahCadatradoException{
		Usuario usuarioPesquisado = usuarioRepositorio.getUsuarioPorLogin(usuario.getLogin());
		if (usuarioPesquisado != null){
			throw new UsuarioJahCadatradoException("Usuario " + usuario + " ja cadastrado!");
		}
		usuarioRepositorio.cadastrarUsuario(new Usuario(usuario.getLogin(), usuario.getSenha()));
	}

	public List<Usuario> getUsuarios() {
		return usuarioRepositorio.getUsuarios();
	}
}



<!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"
	xmlns:rich="http://richfaces.org/rich">

<ui:composition template="template.xhtml">
	<ui:define name="titulo">Usuários</ui:define>
	<ui:define name="principal">
	<h:form>
		<rich:dataTable value="#{usuarioBean.usuarios}" var="usuario">
			<f:facet name="header">
				<h:column>Usuários</h:column>
			</f:facet>
			<rich:column>
            	<f:facet name="header">Login</f:facet>
                <h:outputText value="#{usuario.login}" />
            </rich:column>
            
            <rich:column>
                <f:facet name="header">Senha</f:facet>
            	<h:outputText value="#{usuario.senha}" />
            </rich:column>
            
            <rich:column>
            	<h:form>
            		<h:commandButton style="color:red" value="Remover" action="#{usuarioBean.remover(usuario)}"/>
            	</h:form>
            </rich:column>
            
            <rich:column>
            	<h:form>
            		<h:commandButton style="color:red" value="Alterar" action="#{usuarioBean.editar(usuario)}"/>
            	</h:form>
            </rich:column>
		</rich:dataTable>
		</h:form>
		<h:messages />
	</ui:define>

</ui:composition>

</html>



<!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"
      xmlns:rich="http://richfaces.org/rich">
      

<ui:composition template="template.xhtml">

	<ui:define name="titulo">Edição de Usuário</ui:define>
	<ui:define name="principal">
		 <h:form>
		 		Login: <h:inputText value="#{usuarioBean.usuario.login}" />
		 		Senha: <h:inputText value="#{usuarioBean.usuario.senha}" />
		 		<h:commandButton value="#{msg['usuario.btEditar.nome']}" action="#{usuarioBean.editar()}" />
		 </h:form>
	 	<h:messages/>
	</ui:define>
	
</ui:composition>

</html>

Removendo usuário
Mensagem do console apos tentar remover o usuario da segunda posição:

20:01:38,932 INFO [stdout] (http–127.0.0.1-8080-4) Hibernate: select usuario0_.codigo as codigo35_, usuario0_.login as login35_, usuario0_.senha as senha35_ from Usuario usuario0_

Mensagem do console apos tentar remover o usuario da primeira posição:

20:02:40,100 INFO [stdout] (http–127.0.0.1-8080-6) Hibernate: select usuario0_.codigo as codigo35_, usuario0_.login as login35_, usuario0_.senha as senha35_ from Usuario usuario0_
20:02:40,109 INFO [stdout] (http–127.0.0.1-8080-6) Hibernate: select usuario0_.codigo as codigo35_0_, usuario0_.login as login35_0_, usuario0_.senha as senha35_0_ from Usuario usuario0_ where usuario0_.codigo=?
20:02:40,112 INFO [stdout] (http–127.0.0.1-8080-6) Hibernate: delete from Usuario where codigo=?
20:02:40,129 INFO [stdout] (http–127.0.0.1-8080-6) Hibernate: select usuario0_.codigo as codigo35_, usuario0_.login as login35_, usuario0_.senha as senha35_ from Usuario usuario0_

Alterando usuário

Mensagem do console após tentar alterar o usuário:

22:30:24,681 INFO [stdout] (http–127.0.0.1-8080-4) Hibernate: select usuario0_.codigo as codigo41_, usuario0_.login as login41_, usuario0_.senha as senha41_ from Usuario usuario0_

8 Respostas

Hebert_Coelho

O usuário está com o ID preenchido na hora da segunda exclusão?

W

Colquei o system.out.println(usuario.getCodigo()); no metodo de exclusão da classe usuarioRepositorio e no console mostra o id.
Segue a mensagem do console apos a exclusão e a classe modelo do usuario.

mensagem do console:

23:00:40,279 INFO  [stdout] (http--127.0.0.1-8080-5) Hibernate: select usuario0_.codigo as codigo83_, usuario0_.login as login83_, usuario0_.senha as senha83_ from Usuario usuario0_
23:00:40,288 INFO  [stdout] (http--127.0.0.1-8080-5) Hibernate: select usuario0_.codigo as codigo83_0_, usuario0_.login as login83_0_, usuario0_.senha as senha83_0_ from Usuario usuario0_ where usuario0_.codigo=?
23:00:40,292 INFO  [stdout] (http--127.0.0.1-8080-5) ID:  21
23:00:40,293 INFO  [stdout] (http--127.0.0.1-8080-5) Hibernate: delete from Usuario where codigo=?
23:00:40,324 INFO  [stdout] (http--127.0.0.1-8080-5) Hibernate: select usuario0_.codigo as codigo83_, usuario0_.login as login83_, usuario0_.senha as senha83_ from Usuario usuario0_


package com.gugawag.projeto.modelo;

import java.io.Serializable;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.validation.constraints.NotNull;

@Entity
public class Usuario implements Serializable {

	private static final long serialVersionUID = 1L;
	
	@Id @GeneratedValue
	private Integer codigo;
	private String login;
	private String senha;
	
	public Usuario(){
		this(null, null);
	}
	
	public Usuario(String login, String senha) {
		super();
		this.login = login;
		this.senha = senha;
	}

	public Integer getCodigo() {
		return codigo;
	}

	public void setCodigo(Integer codigo) {
		this.codigo = codigo;
	}

	public String getSenha() {
		return senha;
	}

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

	public String getLogin() {
		return login;
	}

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

No seu MB coloque um try catch no método que chama usuarioRepositorio.removerUsuario(usuario);

e se você colocar um printstacktrace não aparece nada?

W

Coloquei. eo que aparece é isso.

23:36:18,498 Advertência [javax.enterprise.resource.webcontainer.jsf.application] (http–127.0.0.1-8080-6) JSF1063: AVISO! Definindo valor de atributo não serializável em HttpSession (chave: usuarioBean, classe do valor: com.gugawag.projeto.beans.UsuarioBean).
23:36:18,504 INFO [stdout] (http–127.0.0.1-8080-6) Hibernate: select usuario0_.codigo as codigo121_, usuario0_.login as login121_, usuario0_.senha as senha121_ from Usuario usuario0_
23:36:20,389 INFO [stdout] (http–127.0.0.1-8080-5) Hibernate: select usuario0_.codigo as codigo121_, usuario0_.login as login121_, usuario0_.senha as senha121_ from Usuario usuario0_


metodo remover:

public String remover(Usuario usuario){

try{

usuarioRepositorio.removerUsuario(usuario);

}catch (Exception e) {

e.printStackTrace();

}

return null;

}

emanuelmm

o pojo Usuario tem que implementar Serializable.

Vê se pode ser isso companheiro.

W

Já está.

package com.gugawag.projeto.modelo;

import java.io.Serializable;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
public class Usuario implements Serializable {

	private static final long serialVersionUID = 1L;
	
	@Id @GeneratedValue
	private Integer codigo;
	private String login;
	private String senha;
	
	public Usuario(){
		this(null, null);
	}
	
	public Usuario(String login, String senha) {
		super();
		this.login = login;
		this.senha = senha;
	}

	public Integer getCodigo() {
		return codigo;
	}

	public void setCodigo(Integer codigo) {
		this.codigo = codigo;
	}

	public String getSenha() {
		return senha;
	}

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

	public String getLogin() {
		return login;
	}

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

O que eu não entendo é que ele remove do inicio sem problema, mas se mando remover o segundo ou o último, por exemplo, não remove.

W

Amigos, resolvi o problema.
------------------------------------------------------------Mensagem alterada----------------------------------------------------------------------
O <h:commandButton> (excluir e alterar) estava dentro de um rich:column mudei para <h:column> e está funcionando beleza.

Obrigado a todos.

Amigos, peço desculpas a vocês, porque eu me enganei. Na mensagem acima diz que o problema foi por causa do rich:column, mas na realidade
o problema foi por causa do <h:form>. O <h:commandButton> estava dentro do <h:form>, que por sua vez estava dentro do rich:column. Deixando apenas o <h:commandButton> dentro do rich:column funcionou.

Sem funcionar:

<h:form>
        <rich:column>
               <h:form>
                    <h:commandButton>
               </h:form>
        <rich:column>
</h:form>

Funcionando:

<h:form>
        <rich:column>
                    <h:commandButton>
        <rich:column>
</h:form>

Obrigado.

Criado 20 de maio de 2012
Ultima resposta 22 de mai. de 2012
Respostas 8
Participantes 3