[RESOLVIDO]Problema na inserção usando JPA

Olá pessoal,
Estou fazendo meu primeiro projeto Java(Desktop) e estou utilizando JPA(também primeira vez, nem sabia o que era).
Alguém que manja bem dessa parte consegue me dar uma ajuda? É difícil até explicar o problema:
Obs1: estou usando banco Oracle.
Eu tenho uma classe chamada Ibge onde nela eu estou aplicando o JPA(@Entity, @Id, @GeneratorSequence, etc).

import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

/**
 *
 * @author Victor Freidinger
 */
@Entity
@SequenceGenerator(name = "sq_ibge", sequenceName = "sq_ibge", allocationSize = 1, initialValue = 1)
@Table(name = "ca_ibge")
public class Ibge implements EntidadeBase{
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sq_ibge")
    private Long id;
    
    private String codigo;
    private String cidade;
    
    private String estado;
    
    @Column(name = "regiao_id")
    private int regiao;
    private String populacao;
    
    @Column(name = "qtd_funerarias", precision = 0)
    private String qtdFunerarias;
    @Column(name = "estimativa_obitos", precision = 0)
    private String estimativaObitos;
    
    @Column(name = "creation_date")
    @Temporal(TemporalType.TIMESTAMP)
    private final Date creationDate = new Date();

    @Override
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getCodigo() {
        return codigo;
    }

    public void setCodigo(String codigo) {
        this.codigo = codigo;
    }

    public String getCidade() {
        return cidade;
    }

    public void setCidade(String cidade) {
        this.cidade = cidade;
    }

    public String getEstado() {
        return estado;
    }

    public void setEstado(String estado) {
        this.estado = estado;
    }

    public int getRegiao() {
        return regiao;
    }

    public void setRegiao(int regiao) {
        this.regiao = regiao;
    }

    public String getPopulacao() {
        return populacao;
    }
   
    public void setPopulacao(String populacao) {
        this.populacao = populacao;
    }

    public String getQtdFunerarias() {
        return qtdFunerarias;
    }

    public void setQtdFunerarias(String qtdFunerarias) {
        this.qtdFunerarias = qtdFunerarias;
    }

    public String getEstimativaObitos() {
        return estimativaObitos;
    }

    public void setEstimativaObitos(String estimativaObitos) {
        this.estimativaObitos = estimativaObitos;
    }

    
}

Nela eu só tenho os getters and setters. Essa classe extende de uma entidade base(já explico mais abaixo), onde tem só um método chamado getId().

public interface EntidadeBase {
      public Long getId();
    }

Tenho uma classe frmIbge onde tem o desenho da minha tela(feita em NetBeans por ser mais fácil de se desenhar). Nela eu tenho os getters, setters e um método para limpar os campos quando eu clicar no botão cancelar, por exemplo.
Tenho uma classe IbgeDAO que extende de um DAO genérico(Tem um Salvar, Excluir e Pesquisar genérico, que vou utilizar em todas as telas que pretendo fazer), esse DAO Genérico, no botão Salvar recebe uma entidade(no caso Ibge que extende a entidade base).

public class IbgeDAO extends GenericoDAO<Ibge>{
    
}

Até aqui, está funcionando bonitinho. Eu criei uma classe TesteDao chamando a ibge e setando os campos na mão(informo todos os campos, exceto o ID, pois estou utilizando uma sequence no Oracle).
O problema ocorre quando eu estou vinculando com o frame(frmIbge lá de cima).
No frmIbge, além de eu ter o desenho das minhas telas, eu criei um IbgeActionListener para poder centralizar todas as ações em uma classe apenas.
Nessa classe (IbgeActionListener), eu tenho uma ação para cada botão.
As ações nos botões incluir e cancelar, estão funcionando ok, da forma que eu preciso(liberam e bloqueiam os campos conforme clicados).
O problema começa a ocorrer no botão Salvar.
O botão salvar chama o DAO(que espera receber uma entidade, no caso Ibge). Nessa chamada do DAO, eu estou passando método(formParaBanco) que retorna a entidade Ibge.
Esse método formParaBanco que eu estou setando os valores(ibge.setCodigo) pegando os valores do formulário que eu iniciei lá em cima (frm.getTxtCodigo().getText()) por exemplo.

import br.sysurna.model.Ibge;
import br.sysurna.model.IbgeDAO;
import br.sysurna.view.frmCadIBGE;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JOptionPane;

/**
 *
 * @author Victor Freidinger
 */
public class IbgeActionListener implements ActionListener {
    
    private final frmCadIBGE frm;
    private IbgeDAO dao;
    
    public IbgeActionListener (frmCadIBGE frm){
        this.frm = frm;
        adicionarListener();
    }
    
    public void adicionarListener (){
        frm.getBtIncluir().addActionListener(this);
        frm.getBtAlterar().addActionListener(this);
        frm.getBtExcluir().addActionListener(this);
        frm.getBtSalvar().addActionListener(this);
        frm.getBtCancelar().addActionListener(this);
    }

    public void habilitaSalvar(){
        controleBotoes(false);
    }
    
    public void desabilitaSalvar(){
        controleBotoes(true);
    
    }
    
    private void controleBotoes(boolean altera){
    
        frm.getBtIncluir().setEnabled(!altera);
        frm.getBtAlterar().setEnabled(!altera);
        frm.getBtExcluir().setEnabled(!altera);
        frm.getBtSalvar().setEnabled(altera);
        frm.getBtCancelar().setEnabled(altera);
    
    }
    
    private void liberaCampos(){
        controleCampos(true);
    }
    
    private void bloqueiaCampos(){
        controleCampos(false);
    }
    
    private void controleCampos (boolean libera){
        frm.getTxtCodigo().setEditable(libera);
        frm.getTxtCidade().setEditable(libera);
        frm.getCmbEstado().setEnabled(libera);
        frm.getTxtPopulacao().setEditable(libera);
        frm.getTxtQtdeFunerarias().setEditable(libera);
        frm.getTxtEstimativaObitos().setEditable(libera);
    }
    
    @Override
    public void actionPerformed(ActionEvent evento) {
        
        if (evento.getActionCommand().equals("Incluir")){
            Incluir();
        } else if (evento.getActionCommand().equals("Alterar")){
            Alterar();
        } else if (evento.getActionCommand().equals("Excluir")){
            Excluir();
        } else if (evento.getActionCommand().equals("Salvar")){
            Salvar();
        } else if (evento.getActionCommand().equals("Cancelar")){
            Cancelar();
        }
    
    }
    
    private boolean validarCampos() {
        if (frm.getTxtCodigo().getText().equals("")) {
            JOptionPane.showMessageDialog(frm, "Informe o Código do IBGE");
            frm.getTxtCodigo().requestFocus();
            return false;
        }
        if (frm.getTxtCidade().getText().equals("")) {
            JOptionPane.showMessageDialog(frm, "Informe a Cidade");
            frm.getTxtCidade().requestFocus();
            return false;
        }
        if (frm.getCmbEstado().getSelectedIndex() == 0) {
            JOptionPane.showMessageDialog(frm, "Selecione um Estado");
            frm.getCmbEstado().requestFocus();
            return false;
        }
        if (frm.getTxtPopulacao().getText().equals("")) {
            JOptionPane.showMessageDialog(frm, "Informe a População");
            frm.getTxtPopulacao().requestFocus();
            return false;
        }
        if (frm.getTxtQtdeFunerarias().getText().equals("")) {
            JOptionPane.showMessageDialog(frm, "Informe a Quantidade de Funerárias");
            frm.getTxtQtdeFunerarias().requestFocus();
            return false;
        }
        if (frm.getTxtEstimativaObitos().getText().equals("")) {
            JOptionPane.showMessageDialog(frm, "Informe a Estimativa de Óbitos");
            frm.getTxtEstimativaObitos().requestFocus();
            return false;
        }
        return true;
    }
    
    private Ibge formParaBanco(){
        System.out.println("Antes new Ibge");
        Ibge ibge = new Ibge();
        System.out.println("ID = " + ibge.getId().toString());
        System.out.println("Depois new Ibge");
        if(!"".equals(frm.getLbId().getText())){
            ibge.setId(Long.parseLong(frm.getLbId().getText()));
        }
        ibge.setCodigo(frm.getTxtCodigo().getText());
        ibge.setCidade(frm.getTxtCidade().getText());
        ibge.setEstado(frm.getCmbEstado().getSelectedItem().toString());
        ibge.setPopulacao(frm.getTxtPopulacao().getText());
        ibge.setQtdFunerarias(frm.getTxtQtdeFunerarias().getText());
        ibge.setEstimativaObitos(frm.getTxtEstimativaObitos().getText());
        
        return ibge;
    }
    
    private void Incluir(){
        desabilitaSalvar();
        frm.limparCampos();
        liberaCampos();
        
    }
    
    private void Alterar(){
    
    }
    
    private void Excluir(){
        
    }
    
    private void Salvar(){
        validarCampos();
        try {
            dao.salvar(formParaBanco());
        } catch (Exception ex) {
            System.out.println("message = " + ex.getMessage());
            System.out.println("getLocalizedMessage = " + ex.getLocalizedMessage());
            System.out.println("hashCode = " + ex.hashCode());
            System.out.println("toString = " + ex.toString());
        }
        bloqueiaCampos();
    }
    private void Cancelar(){
        frm.limparCampos();
        bloqueiaCampos();
    }
}

O erro que ocorre é ai:
Quando eu instancio o objeto (Ibge ibge = new Ibge():wink: já me estoura um erro (exatamente esse: Não foi possível submeter o ponto de interrupção MethodBreakpoint [br.sysurna.model.Ibge].getIbge_id ‘()Ljava/lang/Long;’, motivo: O método ‘getIbge_id’ com assinatura ‘()Ljava/lang/Long;’ não existe na classe br.sysurna.model.Ibge. )

O erro em si:

Os retornos dos println:

Sim, não existe esse método getIbge_id. A minha dúvida e é onde eu preciso de ajuda: Porque no ‘instanciamento’ desse objeto ele está tentando achar esse método?
Quando(na verdade se) alguém puder ajudar, eu consigo enviar os códigos caso necessário.
Obrigado.

Ficou extenso, mas, não sei realmente como explicar melhor.
Obs2: Lembrando que é o meu primeiro projeto, se há outras formas de fazer o que eu preciso, por favor, me dêem sugestões, estou utilizando formas que eu aprendi vendo videos, fóruns e livros.

Voce usa essa interface apenas para o ID

public interface EntidadeBase {
      public Long getId();
    }

retire a implementação da interface EntidadeBase (não entendi a necessidade desta interface),
faça assim:

public class Ibge{
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sq_ibge")
    private Long id;

 public Long setId() {
        return id;
    }

 public Long getId() {
        return id;
    }


//Demais atributos
    }

Olá, obrigado pelo retorno.

Eu estou utilizando esse getId na Entidade base para poder passar no DAO Generico.

package br.sysurna.model;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

/**
 * DAO Genérico para todos os DAOs
 * @author Victor Freidinger
 */
public class GenericoDAO<T extends EntidadeBase>{
    EntityManagerFactory factory = null;
    EntityManager entityManager = null;
    
     public EntityManager getEM(){
        factory = Persistence.createEntityManagerFactory("SysUrnaPU");
        return factory.createEntityManager();
    }
    
    private void fecharFactory(){
	    //Fecha o factory para liberar os recursos utilizado.
	    factory.close();
	}
    
    /**
    * Método utilizado para salvar ou atualizar as informações
    */
    
    public T salvar(T t) throws Exception{
        EntityManager em = getEM();
        try {
            // Inicia uma transação com o banco de dados.
            System.out.println("antes transaction");
            em.getTransaction().begin();
            System.out.println("depois transaction");
            System.out.println("id = " + t.getId());
            // Verifica se já está cadastrado com este código
            if (t.getId()== null){ 
            System.out.println("Salvando o cadastro.");
            // Salva um registro novo
                em.persist(t); //persist executa um insert
            } else {
                if (!em.contains(t)){ //Consulta numa memória do EntityManager
                    if (em.find(t.getClass(), t.getId()) == null){ //Busca no banco de dados, se não encontrar, deu erro
                        throw new Exception("Erro ao atualizar");
                    }
                }
                System.out.println("Atualizando o cadastro.");
                t = em.merge(t); //merge executa um update
            }            
            em.getTransaction().commit();
        } catch (Exception e){
                System.out.println("Erro -->" + e);
                em.getTransaction().rollback();
        } finally {
            fecharFactory();
        }
        return t;
    }
    
    /**
    * Método que apaga o cadastro do banco de dados.
    */
    
    public T remover(Class<T> clazz, Long id){
        EntityManager em = getEM();
        T t = em.find(clazz, id);
        
        try{
            em.getTransaction().begin();
            System.out.println("Removendo");
            em.remove(t); //executa o delete
            em.getTransaction().commit();
        } catch (Exception e){
            System.out.println("Erro -->" + e);
            em.getTransaction().rollback();
        } finally {
            fecharFactory();
        }
        return t;
    }
    
    public T ConsultaPorId(Class<T> clazz, Long id){
        EntityManager em = getEM();
        T t = null;
        try {
        t = em.find(clazz, id); //executa o select no banco
        } finally {
            fecharFactory();
        }
        return t;
    }
}

Não acredito que seja esse o problema, pois, estou utilizando uma classe TesteIbge passando os parametros na mão e funciona de boa:

package br.sysurna.testes;

import br.sysurna.model.Ibge;
import br.sysurna.model.IbgeDAO;

/**
 *
 * @author Victor Freidinger
 */
public class TesteIbge {

    public static void main(String[] args) throws Exception {
        Ibge i = new Ibge();

        i.setCodigo("20");
        i.setCidade("Limeira");
        i.setEstado("SP");
        i.setPopulacao("30");
       

        IbgeDAO dao = new IbgeDAO();
        i = dao.salvar(i); //Insert
        
        System.out.println("Estado = " + i.getEstado());
        System.out.println("Estado com toSTring = " + i.getEstado().toString());

    
    }
}

@Douglas_Janerson eu encontrei o problema:

Na minha classe ActionListener, o meu DAO não estava instanciado corretamente. :frowning:
Foi o dia todo encontrando um problema que não existia, era apenas um ‘ponto-vírgula’.

Em vez de eu instanciar aqui:

private IbgeDAO dao;

Logo no começo da classe, eu instanciei na hora de Salvar:

private void Salvar(){
        validarCampos();
        try {
            IbgeDAO dao = new IbgeDAO(); 
            Ibge ibge = dao.salvar(formParaBanco());
        } catch (Exception ex) {
            System.out.println("message = " + ex.getMessage());
            System.out.println("getLocalizedMessage = " + ex.getLocalizedMessage());
            System.out.println("hashCode = " + ex.hashCode());
            System.out.println("toString = " + ex.toString());
        }
        bloqueiaCampos();
    }

Salvou bonitinho no banco.
Obrigado.