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() 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.