Só para confirmar uma dúvida: na CategoriaDAO, o método "atualizar" não precisa reatribuir o objeto com o merge, pois o intuito é já passar como parâmetro a categoria atualizada e o merge vai devolver um outro objeto atualizado para o commit.
Já no método de remover, vamos reatribuir, pois precisamos que aquele objeto no parâmetro em específico seja o mergeado, para removê-lo depois, correto?
Já aproveitando, no método de atualizar (quando não reatribuímos), qual é a trajetória desse objeto mergeado? Para onde ele vai por trás dos panos? Não temos mais acesso a ele, certo? E já que ele devolve esse outro objeto atualizado, o que acontece também com o objeto não mergeado? Entendo que vão existir dois objetos na memória nessa situação, um retornado mergeado e outro não mergeado que ficou ali, "vagando", rs.