Pessoal,
Estou tentando fazer algo simples com JSF mas estou cometendo algum erro que não consigo encontrar.
Tenho uma lista de usuários e desejo poder editar algum deles em uma outra tela, diferente da tela de listagem.
Consigo mostrar a tela de edição com os campos preenchidos, porém o Hibernate sempre faz um insert ao invés de um update.
Sei que em algum momento estou perdendo a referência para o objeto usuário que está no estado Managed do Hibernate e por isso ocorre o insert mas não consigo resolver o problema.
Segue o código.
O ManagedBean
import javax.faces.component.UIComponent;
import javax.faces.component.UIParameter;
import javax.faces.context.FacesContext;
import org.hibernate.Session;
import br.gov.ba.sicm.cmo.cadastro.dao.UsuarioDAO;
import br.gov.ba.sicm.cmo.cadastro.entity.Usuario;
import br.gov.ba.sicm.cmo.spcg.OutComeMsg;
public class UsuarioHandler {
private Usuario usuario = new Usuario();
private Session sessaoHibernate;
public String escolheUsuario() {
UIComponent formUsuario = FacesContext.getCurrentInstance().getViewRoot().findComponent("formUsuario");
UIParameter param = (UIParameter) formUsuario.findComponent("formUsuario:idDataTable:editId");
Long id = (Long) param.getValue();
UsuarioDAO dao = new UsuarioDAO(sessaoHibernate);
usuario = dao.get(id);
return OutComeMsg.editar.toString();
}
public String salva() {
UsuarioDAO dao = new UsuarioDAO(sessaoHibernate);
if (dao.merge(usuario)) {
return OutComeMsg.sucesso.toString();
} else {
return OutComeMsg.falha.toString();
}
}
public Usuario getUsuario() {
return usuario;
}
public void setSessaoHibernate(Session sessaoHibernate) {
this.sessaoHibernate = sessaoHibernate;
}
}
listarUsuario.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
<f:view>
<jsp:include page="/topo.jsp" />
<h:form id="formUsuario">
<center><h:dataTable border="1"
value="#{usuarioHandler.lista}" var="u"
rendered="#{not empty usuarioHandler.lista}" id="idDataTable">
<h:column>
<f:facet name="header">
<h:outputText value="Alterar" />
</f:facet>
<h:commandLink action="#{usuarioHandler.escolheUsuario}"
id="idComando">
<h:outputText value="(Alterar)" />
<f:param id="editId" name="id" value="#{u.id}" />
</h:commandLink>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="ID" />
</f:facet>
<h:outputText value="#{u.id}" />
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="Nome" />
</f:facet>
<h:outputText value="#{u.nome}" />
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="Login" />
</f:facet>
<h:outputText value="#{u.login}" />
</h:column>
</h:dataTable></center>
</h:form>
<jsp:include page="/fim.jsp" />
</f:view>
editarUsuario.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
<f:view>
<jsp:include page="/topo.jsp" />
<h:form id="cadastro">
<table border="0" cellpadding="0" cellspacing="10" align="center">
<tr>
<td>Nome:</td>
<td><h:inputText id="nome" required="true"
value="#{usuarioHandler.usuario.nome}">
<f:validateLength minimum="5" />
</h:inputText> <h:message for="nome" />
<h:inputHidden value="#{usuarioHandler.usuario.id}"/>
</td>
</tr>
<tr>
<td>Login:</td>
<td><h:inputText value="#{usuarioHandler.usuario.login}" /></td>
</tr>
<tr>
<td>Senha:</td>
<td><h:inputSecret value="#{usuarioHandler.usuario.senha}" /></td>
</tr>
<tr align="center">
<td colspan="2"><h:commandButton value="Salvar" action="#{usuarioHandler.salva}" /></td>
</tr>
</table>
</h:form>
<jsp:include page="/fim.jsp" />
</f:view>
Grato,
Tássio Coêlho