JPA: Problema de Stackoverflow usando relacionamento bidirecional

Salve pessoal do Guj

Estou aprendendo JPA e como não poderia ser diferente estou com problemas para usá-lo.

No projeto tenho uma classe Sistema e uma classe Modulo, um Sistema pode ter vários módulos e um módulo pertence a apenas um sistema.

Estou fazendo as rotinas para salvar o módulo e quando crio um selecionando um sistema sem nenhum outro módulo tudo ok, mas se tento inserir um novo módulo num sistema que já tenha módulos, alterar ou excluir o módulo, recebo a exception StackOverflow.

Minhas entidades e meu código para salvar (incluir e atualizar) e excluir estão assim:

public class Modulo implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int cod_modulo;

    @ManyToOne(optional = false)
    @JoinColumn(name = "cod_sistema", nullable = false)
    private Sistema sistema;

    private String nome_modulo;
    .....
}

@Entity
public class Sistema implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int cod_sistema;

    private String nome_sistema;

    @OneToMany(mappedBy = "sistema")
    private Set<Modulo> modulos;
}

// método usado para salvar e excluir
public void save() {
    try {
        modulo.setSistema(sistemaService
                .findByCod_sistema((Integer) sistemaSelected));
        moduloService.save(modulo);
        addMessage("frmModulo", "Salvo com sucesso!");
    } catch (Exception e) {
        addMessage("frmModulo", "Erro!\n" + e.getMessage());
        e.printStackTrace();
    } finally {
        modulo = new Modulo();
        sistemaSelected = null;
    }
}

public void delete() {
    modulo = getFromModel();
    try {
        moduloService.delete(modulo);
        addMessage("frmModulo", "Excluído com sucesso!");
    } catch (Exception e) {
        addMessage("frmModulo", "Erro!\n" + e.getMessage());
        e.printStackTrace();
    } finally {
        modulo = new Modulo();
        sistemaSelected = null;
    }
}

// métodos que fazem o serviço sujo
public void delete(Modulo objeto) throws Exception {
    EntityManager em;
    WebFactory webFactory = new WebFactory();
    em = webFactory.getEmf().createEntityManager();

    try {
        em.getTransaction().begin();
        objeto = em.merge(objeto);
        em.remove(objeto);
        em.getTransaction().commit();
    } catch (Exception e) {
        em.getTransaction().rollback();
        throw e;
    } finally {
        em.clear();
        em.close();
    }
}

public void save(Modulo objeto) throws Exception {
    EntityManager em;
    WebFactory webFactory = new WebFactory();
    em = webFactory.getEmf().createEntityManager();

    try {
        em.getTransaction().begin();
        em.merge(objeto);
        em.getTransaction().commit();
    } catch (Exception e) {
        em.getTransaction().rollback();
        throw e;
    } finally {
        em.clear();
        em.close();
    }
}

Agradeço quem puder me ajudar, estou travado nisso aqui faz um tempo já :frowning: