[RESOLVIDO] Duvida - Erro em update JDBC + Postgree

2 respostas
P

Galera,

Estou me deparando com um erro que eu não consegui resolver. Pesquisei no Google e aqui no fórum mas nao achei nada que pudesse me ajudar. Estou testes unitários em uma classe e quando coloco para rodar me deparo com o seguinte erro:

01/06/2011 20:11:05 nst.controlenst.persistence.dao.obj.impl.JDBCProjeto save
GRAVE: null
org.postgresql.util.PSQLException: Não pode inferir um tipo SQL a ser usado para uma instância de nst.controlenst.model.entity.Situacao. Use setObject() com um valor de Types explícito para especificar o tipo a ser usado.

Gostaria de uma força de vcs para asoluçao desse problema. É a primeira vez que eu uso PostGree e estou levando essa surra. Agradeço desde já.
Meu código fonte está assim:

JDBCProjetoTest.java
@Test
    public void testUpdate() {
        System.out.println("update");
        Projeto projeto = new Projeto();
        Timestamp tm = new Timestamp(System.currentTimeMillis());
        projeto.setId(2);
        projeto.setDataCadastro(tm);
        projeto.setDataEncerramento(tm);
        projeto.setDataEncerramentoPrevisto(tm);
        projeto.setDataInicio(tm);
        projeto.setDescricao("Descricao nova");
        projeto.setIdentificador("teste");
        projeto.setNome("Teste do nome");
        Situacao situacao = new Situacao();
        situacao.setId(5);
        projeto.setSituacao(situacao);
        projeto.setTipo(JDBCTipo.getInstance().getByPrimaryKey(1));
        
        instance.save(projeto);
        
    }
JDBCProjeto.java
@Override
    public void save(Projeto projeto) {
        if (projeto.getId() == null || projeto.getId() == 0) {
            try {
                executarComando(SQL_ADD_PROJETOS, projeto.getIdentificador(),
                           projeto.getDataCadastro(),
                           projeto.getDataInicio(),
                           projeto.getDataEncerramentoPrevisto(),
                           projeto.getDataEncerramento(),
                           projeto.getDescricao(),
                           projeto.getSituacao().getId(),
                           projeto.getTipo().getId(),
                           projeto.getNome());
            } catch (SQLException ex) {
                Logger.getLogger(JDBCProjeto.class.getName()).log(Level.SEVERE, null, ex);
            }
             
        }else{
            try {
                executarComando(SQL_UPD_PROJETOS, projeto.getIdentificador(),
                                projeto.getDataCadastro(),
                                projeto.getDataInicio(),
                                projeto.getDataEncerramentoPrevisto(),
                                projeto.getDataEncerramento(),
                                projeto.getDescricao(),
                                projeto.getSituacao(),
                                projeto.getTipo(),
                                projeto.getNome(),
                                projeto.getId());
            } catch (SQLException ex) {
                Logger.getLogger(JDBCProjeto.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
GenericJDBCDAO
public abstract class GenericJDBCDAO {

    protected abstract Object preencherEntidade(ResultSet rs) throws SQLException;

    public Statement getStatement() throws SQLException {
        return (Statement) ConnectionJDBC.getConnection().createStatement();
    }

    public PreparedStatement getStatement(String sql) throws SQLException {
        return ConnectionJDBC.getConnection().prepareStatement(sql);
    }

    public ResultSet executarQuery(String query, Object... params) throws SQLException {
        PreparedStatement ps = getStatement(query);
        for (int i = 0; i < params.length; i++) {
            ps.setObject(i + 1, params[i]);
        }

        return ps.executeQuery();
    }

    public int executarComando(String query, Object... params) throws SQLException {
        PreparedStatement ps = getStatement(query);

        for (int i = 0; i < params.length; i++) {
            ps.setObject(i + 1, params[i]);
        }
        
        int result = ps.executeUpdate();
        ps.close();
        return result;

    }
}
Situacao.java
public class Situacao implements Serializable {

    private Integer id;
    private String descricao;

    public Situacao() {
    }

    public Situacao(Integer id, String descricao) {
        this.id = id;
        this.descricao = descricao;
    }

    public String getDescricao() {
        return descricao;
    }

    public void setDescricao(String descricao) {
        this.descricao = descricao;
    }

    public Integer getId() {
        return id;
    }

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

2 Respostas

D

Olá,

Na sua classe JDBCProjeto no metodo save, no meio de todos esses projeto.get(X) voce está passando algum tipo que aqui : ps.setObject(i + 1, params[i]); não está aceitando, não conheço todo o código mais acredito que o erro possa estar onde voce de uma forma passa
projeto.getSituacao().getId(),
projeto.getTipo().getId(),

E no outro fluxo (else) voce passa:
projeto.getSituacao(),
projeto.getTipo(),

Isso esta divergente, e algo não está sendo aceito, sugiro que faça uns testes nesse ponto.

Abraços
Daniel.

P

danieldomingues86,

Brigadão cara! Foi isso mesmo. Eu estava passando pro banco um objeto e não o atributo id.

As vezes esse tipo de falha toma um tempo danado e cansa a mente para caramba. Ontem mesmo eu estava um tempão tentando achar na depuração isso e não enxergava. Rsrsrs. Tem horas que vesga mesmo!

Mais uma vez obrigado.

Criado 1 de junho de 2011
Ultima resposta 2 de jun. de 2011
Respostas 2
Participantes 2