Como reaproveitar melhor o codigo em Java

Oi gente, sou desenvolvedor Java, tenho pouco mais de 1 ano de experiência, mas ainda sou muito ruim para fazer reaproveitamento de codigo, gostaria de uma ajuda do pessoal para ver se consigo reaproveitar melhor meu codigo.

Abaixo tem dois exemplos de código, os dois são grandes, mas porém são muito parecidos e não sei como reaproveita-lo(reescreve-lo para que não tenha que ficar repetindo código)
ps: uso JSF e Hibernate

Caso alguém possa analisar e me dar uma ajuda a refatorar ou reescrever o codigo(não sei qual se aplica a este caso) eu ficaria imensamente agradecido

ManagedBean GravaParentescoComum

@ManagedBean
@ViewScoped
public class GravaParentescoComum implements Serializable {

    private Integer par_id;
    private Integer sal_id;
    private Integer cid_id;
    private String par_tipo;
    private String par_nome;
    private Long par_telefone1;
    private Long par_telefone2;
    private String par_email;
    private Long par_cep;
    private String par_logradouro;
    private Long par_numero;
    private String par_complemento;
    private String par_bairro;
    private Integer par_pai_id;
    private Integer par_est_id;
    private List l;

    public GravaParentescoComum() {
        listaFechada();
    }

    public void listaFechada() {
        //Pega id e tipo do usuario da sessão
        Object tip = FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("tipoUsuario");
        Object id = FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("idUsuario");
        //Serve para setar valor na lista de cidade/estado/pais
        Integer numeroEstado = null;
        Integer numeroPais = null;

        //inicia sessão
        Session sessao = HibernateUtil.getSession();
        //baseado no usuario, captura id da pessoa
        Usuario usuario = (Usuario) sessao.get(Usuario.class, new Integer(id.toString()));
        Integer pe_id = usuario.getPessoas().getPes_id();
        
        //usando o id da pessoa, carrega os dados do salesiano
        Criteria criteria = (Criteria) sessao.createCriteria(Salesianos.class).
                    add(Restrictions.eq("pessoas.pes_id", new Integer(pe_id)));
        Salesianos salesiano = (Salesianos) criteria.uniqueResult();
        Integer sa_id = salesiano.getSal_id();
        setSal_id(sa_id);
        Criteria criteria2 = (Criteria) sessao.createCriteria(Parentesco.class).
                    add(Restrictions.eq("salesianos.sal_id", new Integer(sa_id)));

        setL(criteria2.list());        
        
        sessao.close();

    }
    
    public void editar() throws Exception {
        String id = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("id");
                
        
        Integer numeroEstado = null;
        Integer numeroPais = null;

        Session sessao = HibernateUtil.getSession();
        //seleciona cidade baseada no id
        Parentesco listagem_query = (Parentesco) sessao.get(Parentesco.class, new Integer(id.toString()));
        
        System.out.println("consegui aparecer: " + id + " - "+listagem_query.getPar_nome());
        
        setPar_bairro(listagem_query.getPar_bairro());
        setPar_cep(listagem_query.getPar_cep());
        setPar_complemento(listagem_query.getPar_complemento());
        setPar_email(listagem_query.getPar_email());
        setPar_id(listagem_query.getPar_id());
        setPar_logradouro(listagem_query.getPar_logradouro());
        setPar_nome(listagem_query.getPar_nome());
        setPar_numero(listagem_query.getPar_numero());
        setPar_telefone1(listagem_query.getPar_telefone1());
        setPar_telefone2(listagem_query.getPar_telefone2());
        setPar_tipo(listagem_query.getPar_tipo());
        setSal_id(listagem_query.getSalesianos().getSal_id());

        if (listagem_query.getCidade() != null) {

            //calcula lista e atributos para cidade
            numeroPais = listagem_query.getCidade().getEstado().getPais().getPai_id();
            numeroEstado = listagem_query.getCidade().getEstado().getEst_id();
            Criteria listasEst = sessao.createCriteria(Estado.class).
                    add(Restrictions.eq("pais.pai_id", new Integer(numeroPais))).
                    addOrder(Order.asc("est_nom"));
            Criteria listasCid = sessao.createCriteria(Cidade.class).
                    add(Restrictions.eq("estado.est_id", new Integer(numeroEstado))).
                    addOrder(Order.asc("cid_nom"));
            List<Estado> listaEstado = listasEst.list();
            List<Cidade> listaCidade = listasCid.list();

            GravaCidade.setEstadosMany(listaEstado);
            GravaCidade.setCidadesMany(listaCidade);

            setPar_est_id(listagem_query.getCidade().getEstado().getEst_id());
            setPar_pai_id(listagem_query.getCidade().getEstado().getPais().getPai_id());
            setCid_id(listagem_query.getCidade().getCid_id());
        }else{
            GravaCidade.setEstadosMany(null);
            GravaCidade.setCidadesMany(null);

            setPar_est_id(null);
            setPar_pai_id(null);
            setCid_id(null);
        }
        sessao.close();

    }

    public void gravar() {
        Session sessao = HibernateUtil.getSession();
        Transaction tx_pessoa = sessao.beginTransaction();
        try {

            Cidade obj_cid = new Cidade();
            obj_cid.setCid_id(cid_id);

            Salesianos obj_sal = new Salesianos();
            obj_sal.setSal_id(getSal_id());

            Parentesco obj_par = new Parentesco();

            if (getPar_id() != 0) {
                obj_par.setPar_id(getPar_id());
            }

            if (getPar_telefone1() != 0) {
                obj_par.setPar_telefone1(getPar_telefone1());
            }
            if (getPar_telefone2() != 0) {
                obj_par.setPar_telefone2(getPar_telefone2());
            }
            if (getPar_cep() != 0) {
                obj_par.setPar_cep(getPar_cep());
            }
            if (getPar_numero() != 0) {
                obj_par.setPar_numero(getPar_numero());
            }

            obj_par.setPar_tipo(getPar_tipo());
            obj_par.setPar_nome(getPar_nome());
            obj_par.setPar_email(getPar_email());
            obj_par.setPar_logradouro(getPar_logradouro());
            obj_par.setPar_complemento(getPar_complemento());
            obj_par.setPar_bairro(getPar_bairro());

            obj_par.setSalesianos(obj_sal);
            if(getCid_id()!=0){
                obj_par.setCidade(obj_cid);
            }
            
            sessao.saveOrUpdate(obj_par);
            tx_pessoa.commit();
            sessao.close();
            Limpar.refresh();
            FacesContext.getCurrentInstance().addMessage("FormParentesco:gravar", new FacesMessage("Informações gravadas com sucesso!"));

        } catch (Exception erro) {
            System.out.println("Erro na insersão : " + erro);
            tx_pessoa.rollback();
            sessao.close();
            FacesContext.getCurrentInstance().addMessage("FormParentesco:gravar", new FacesMessage("Falha ao gravar informações!"));
        }
    }

    public void excluir() {
        Session sessao = HibernateUtil.getSession();
        Transaction tx_pessoa = sessao.beginTransaction();
        try {
            Parentesco obj_par = new Parentesco();

            obj_par.setPar_id(getPar_id());

            sessao.delete(obj_par);
            tx_pessoa.commit();
            sessao.close();
            Limpar.refresh();
            FacesContext.getCurrentInstance().addMessage("FormParentesco:excluir", new FacesMessage("Informações excluídas com sucesso!"));

        } catch (Exception erro) {
            System.out.println("Erro na insersão : " + erro);
            tx_pessoa.rollback();
            sessao.close();
            FacesContext.getCurrentInstance().addMessage("FormParentesco:excluir", new FacesMessage("Falha ao excluir informações!"));
        }
    }

}
getters e setters

ManagedBean GravaHistGraduacaoComum

@ManagedBean
@ViewScoped
public class GravaHistGraduacaoComum implements Serializable {

    private Integer hgr_id;
    private Integer sal_id;
    private Integer cid_id;
    private String hgr_tipo_graduacao;
    private String hgr_titulo;
    private Date hgr_data_inicial;
    private Date hgr_data_final;
    private String hgr_instituicao;
    private Integer hgr_carga_horaria;
    private Integer hgr_pai_id;
    private Integer hgr_est_id;
    private List l;

    public GravaHistGraduacaoComum() {
        listaFechada();
    }
    
    public void listaFechada() {
        //Pega id e tipo do usuario da sessão
        Object tip = FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("tipoUsuario");
        Object id = FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("idUsuario");
        //Serve para setar valor na lista de cidade/estado/pais
        Integer numeroEstado = null;
        Integer numeroPais = null;

        //inicia sessão
        Session sessao = HibernateUtil.getSession();
        //baseado no usuario, captura id da pessoa
        Usuario usuario = (Usuario) sessao.get(Usuario.class, new Integer(id.toString()));
        Integer pe_id = usuario.getPessoas().getPes_id();
        
        //usando o id da pessoa, carrega os dados do salesiano
        Criteria criteria = (Criteria) sessao.createCriteria(Salesianos.class).
                    add(Restrictions.eq("pessoas.pes_id", new Integer(pe_id)));
        Salesianos salesiano = (Salesianos) criteria.uniqueResult();
        Integer sa_id = salesiano.getSal_id();
        setSal_id(sa_id);
        Criteria criteria2 = (Criteria) sessao.createCriteria(Hist_Graduacao.class).
                    add(Restrictions.eq("salesianos.sal_id", new Integer(sa_id)));

        setL(criteria2.list());        
        
        sessao.close();

    }

    public void editar() {
        String id = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("id");
        //System.out.println("consegui aparecer: " + id); 
        Integer numeroEstado = null;
        Integer numeroPais = null;

        Session sessao = HibernateUtil.getSession();
        //seleciona cidade baseada no id
        Hist_Graduacao listagem_query = (Hist_Graduacao) sessao.get(Hist_Graduacao.class, Integer.valueOf(id));
        setHgr_carga_horaria(listagem_query.getHgr_carga_horaria());
        setHgr_data_final(listagem_query.getHgr_data_final());
        setHgr_data_inicial(listagem_query.getHgr_data_inicial());
        setHgr_id(listagem_query.getHgr_id());
        setHgr_instituicao(listagem_query.getHgr_instituicao());
        setHgr_tipo_graduacao(listagem_query.getHgr_tipo_graduacao());
        setHgr_titulo(listagem_query.getHgr_titulo());
        setSal_id(listagem_query.getSalesianos().getSal_id());

        if (listagem_query.getCidade() != null) {

            //calcula lista e atributos para cidade
            numeroPais = listagem_query.getCidade().getEstado().getPais().getPai_id();
            numeroEstado = listagem_query.getCidade().getEstado().getEst_id();
            Criteria listasEst = sessao.createCriteria(Estado.class).
                    add(Restrictions.eq("pais.pai_id", new Integer(numeroPais))).
                    addOrder(Order.asc("est_nom"));
            Criteria listasCid = sessao.createCriteria(Cidade.class).
                    add(Restrictions.eq("estado.est_id", new Integer(numeroEstado))).
                    addOrder(Order.asc("cid_nom"));
            List<Estado> listaEstado = listasEst.list();
            List<Cidade> listaCidade = listasCid.list();

            GravaCidade.setEstadosMany(listaEstado);
            GravaCidade.setCidadesMany(listaCidade);

            setHgr_est_id(listagem_query.getCidade().getEstado().getEst_id());
            setHgr_pai_id(listagem_query.getCidade().getEstado().getPais().getPai_id());
            setCid_id(listagem_query.getCidade().getCid_id());
        } else {
            GravaCidade.setEstadosMany(null);
            GravaCidade.setCidadesMany(null);

            setHgr_est_id(null);
            setHgr_pai_id(null);
            setCid_id(null);
        }
        sessao.close();

    }

    public void gravar() {
        Session sessao = HibernateUtil.getSession();
        Transaction tx = sessao.beginTransaction();
        try {
            Cidade obj_cid = new Cidade();
            obj_cid.setCid_id(getCid_id());

            Salesianos obj_sal = new Salesianos();
            obj_sal.setSal_id(getSal_id());

            Hist_Graduacao obj_hgr = new Hist_Graduacao();

            if (getHgr_id() != 0) {
                obj_hgr.setHgr_id(hgr_id);
            }

            if (getHgr_carga_horaria() != 0) {
                obj_hgr.setHgr_carga_horaria(getHgr_carga_horaria());
            }
            if (!getHgr_instituicao().equals("")) {
                obj_hgr.setHgr_instituicao(AlteraLetras.retornaFrase(getHgr_instituicao()));
            }
            obj_hgr.setHgr_data_final(getHgr_data_final());
            obj_hgr.setHgr_data_inicial(getHgr_data_inicial());

            obj_hgr.setHgr_tipo_graduacao(getHgr_tipo_graduacao());
            obj_hgr.setHgr_titulo(getHgr_titulo());

            obj_hgr.setSalesianos(obj_sal);
            if (getCid_id() != 0) {
                obj_hgr.setCidade(obj_cid);
            }            

            sessao.saveOrUpdate(obj_hgr);
            tx.commit();
            sessao.close();
            Limpar.refresh();
            FacesContext.getCurrentInstance().addMessage("FormHistGraduacao:gravar", new FacesMessage("Informações gravadas com sucesso!"));

        } catch (Exception erro) {
            System.out.println("Erro na insersão : " + erro);
            tx.rollback();
            sessao.close();
            FacesContext.getCurrentInstance().addMessage("FormHistGraduacao:gravar", new FacesMessage("Falha ao gravar informações!"));
        }
    }

    public void excluir() {
        Session sessao = HibernateUtil.getSession();
        Transaction tx = sessao.beginTransaction();
        try {
            Hist_Graduacao obj_hgr = new Hist_Graduacao();

            obj_hgr.setHgr_id(hgr_id);

            sessao.delete(obj_hgr);
            tx.commit();
            sessao.close();
            Limpar.refresh();
            FacesContext.getCurrentInstance().addMessage("FormHistGraduacao:excluir", new FacesMessage("Informações excluídas com sucesso!"));

        } catch (Exception erro) {
            System.out.println("Erro na insersão : " + erro);
            tx.rollback();
            sessao.close();
            FacesContext.getCurrentInstance().addMessage("FormHistGraduacao:excluir", new FacesMessage("Falha ao excluir informações!"));
        }
    }

}

Porque você num cria uma interface ou classe abstrata que possua estes métodos, ai depois é só sobrescrever eles se for o caso.

Nesse caso acho q nao daria muito certo, pois eu ia ter q sobreescrever os metodos em todos os managedBean que eu uso, pois cada um tem um pequeno detalhe diferente em cada parte, mas a maioria do codigo é igual, eu gostaria de deixar apenas a parte que é diferente em cada managedBean e deixar a parte igual em uma classe a parte, mas não sei como fazer isso

Ja pensou em criar um DAO genérico para a sua persistência?

O uso de Generics…