dÚvida com lÓgica no servlet

Olá pessoal, estou com dúvida de como utilizar o servlet, nesse caso, o meu professor implementou a persistência no banco, o link Editar e Excluir da aplicação, porém, eu gostaria de saber o papel das linhas onde são utilizados os métodos:
beginTransaction();
getSession().merge();
commitTransaction();
closeSession();

Eu sei que o servlet iniciará a transação com o begin, persistirá com o commit e fechará a requisição com o close… mas e o papel do Merge ?

        String acao = request.getParameter("acao");
        System.out.println("acao: " + acao);
        if (acao == null) {
            acao = "";
        }

        if (acao.equals("salvar")) {
            System.out.println("salvaaaa");
            Animal ani = new Animal();
            if (request.getParameter("id") !=null){
                ani.setId(Long.parseLong(request.getParameter("id")));
            }
            else{
                ani.setId(null);
            }
            ani.setNome(request.getParameter("nome"));
            ani.setRaca(request.getParameter("raca"));
            ani.setEspecie(request.getParameter("especie"));
            ani.setCor(request.getParameter("cor"));
            ani.setPeso(Double.parseDouble(request.getParameter("peso")));
            HibernateUtil.beginTransaction();
            HibernateUtil.getSession().merge(ani);
            HibernateUtil.commitTransaction();
            HibernateUtil.closeSession();
        } else if (acao.equals("editar")) {
            Long id = Long.parseLong(request.getParameter("id")); 
            Animal a = (Animal) HibernateUtil.getSession().get(Animal.class, id);
            
            request.setAttribute("animalParaEditar", a);
            //editar
        } else if (acao.equals("excluir")) {
            Long id = Long.parseLong(request.getParameter("id")); // Converte de String para LONG, pois toda entrada em java, é uma String
            Animal animal = (Animal) HibernateUtil.getSession().get(Animal.class, id); //  recuperar o objeto inteiro para recuperar e excluir abaixo
            HibernateUtil.beginTransaction();
            HibernateUtil.getSession().delete(animal);
            HibernateUtil.commitTransaction();
            HibernateUtil.closeSession();
            //excluir
        }

        List<Animal> lista = new ArrayList<Animal>();
        Criteria cri = HibernateUtil.getSession().createCriteria(Animal.class);
        //filtro para restringir a consulta
        //cri.add(Restrictions.ilike("nome", "ja"));
        lista = cri.list();
        request.setAttribute("lista", lista);

        request.getRequestDispatcher("index.jsp").forward(request, response);
    }

http://www.guj.com.br/java/98071-diferenca-entre-o-save-e-o-merge---hibernate