Ciclo de vida do JSF

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

Cara faz o seguinte teste, caso o tenha o id recupera o cara do bd denovo.

Mas se eu recuperar o usuário de novo pelo ID os novos dados submetidos pelo formulário serão perdidos e eu não poderei fazer o update.

Como você esta injetando o

private Session sessaoHibernate;

outra coisa quando o usuário esta chegando para dar o merge o id esta preenchido.

Faz o teste trocando o merge() pelo update().