Hibernate - Insert ao invés de update

Boa noite pessoal.
Estou utilizando hibernate e JSF + Primefaces e estou tendo um problema.
Quando tento editar um objeto ele faz um insert ao invés de executar um update.
Segue abaixo o código:

@ManagedBean
@RequestScoped
public class DocumentoBean implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private Aluno aluno;
	private Documento documento;
	private boolean readOnly;
	private DocumentoDaoImp dao;

	public DocumentoBean() {		
		dao = new DocumentoDaoImp();
		String doc = Util.getParametro("id");
		aluno = (Aluno)SystemBean.getUsuario();
		if(doc != null){
			documento = dao.getById(Long.parseLong(doc));
			if(documento != null){
				if(!aluno.equals(documento.getDono())){
					if(documento.isPublico()){
						readOnly = true;
						documento.incVisualizacoes();
					}else{				
						CompartilhamentoDaoImp compDao = new CompartilhamentoDaoImp();
						Compartilhamento comp = compDao.get(documento, aluno);
						if(comp != null){
							readOnly = !comp.isEscrita();
							documento.incVisualizacoes();
						}else{
							dao.cancel();
							Util.erro("Você não tem permissão para acessar este documento");
						}		
					}
				}else{
					documento.incVisualizacoes();
				}
			}else{
				Util.erro("Documento não encontrado");
			}
		}else{			
			documento = new Documento();
			documento.setDono(aluno);
		}
	}

	public void salvar(ActionEvent actionEvent){
		dao.save(documento);
	}

      //getters e setters
}

e a classe que uso para a persistência:

public class GenericDaoImp<T> implements GenericDao<T> {
@Override
	public T save(T object) {
		try{
			AnnotationConfiguration cfg = new AnnotationConfiguration();
			cfg.configure();


			SessionFactory factory = cfg.buildSessionFactory();
			Session session = factory.openSession();
			Transaction t = session.beginTransaction();


			Object obj = session.merge(object);
			t.commit();
			session.close();
			return (T) obj;
		}catch(HibernateException e){
			cancel();
			throw e;
		}
	}
}

O que estou fazendo de errado?

Faça um debug e veja se o ID do seu objeto está preenchido antes de você chamar o método.

Fiz um debug aqui e percebi que ao clicar em no botão que chama o método salvar o construtor está sendo chamado novamente.
Por que isso está acontecendo?

Seu MB está com o @RequestScoped. Após retornar os dados para você, tudo que estava na memória vai embora.

mas ele não deveria executar o método salvar antes?

O JSF tem faz um pool de MBs que são requested scope para atender mais rápido as requisições.

Pode ser q ele está dando new em um mas vc está utilizando outro. Ou então que ele executa o construtor, mas reinicia tudo quando ele for ser utilizando.

A idéia de RequestScoped é que todas informações estejam “zeradas/limpas” ao iniciar um trabalho.

Pq vc não arranca esse método do construtor, cria um método só para isso e chama do salvar?

É porque aí nesse construtor, se for passado o id por parâmetro na página ele já carrega os dados do documento para fazer a edição, senão instancia um novo.
O problema é que quando eu chamo a página ele busca corretamente do banco de dados. Mas na hora de salvar o id fica zerado novamente…