Update em tabela Java com PostgreSQL

Tenho um Formulário de cadastro, simples com código, nome, sobre. No formulário eu removi o código para não aparecer, ficou só nome e sobre, mais agora quando faço um Update pelo programa não atualiza o registro, mais seu colocar o código no formulário ai vai normal.

#ContatoDAO

public void atualizar(Contato contato) {
    conecta.conexao(); //Abre a conexão
    try {
        String sql = "UPDATE contato SET id=?, nome=?, sobrenome=? WHERE id=?";
        PreparedStatement pstm = conecta.conn.prepareStatement(sql);
        pstm.setInt(1, contato.getId());
        pstm.setString(2, contato.getNome());
        pstm.setString(3, contato.getSobrenome());
        pstm.execute();

        JOptionPane.showMessageDialog(null, "Atualizado com Sucesso");

    } catch (SQLException erro) {
        JOptionPane.showMessageDialog(null, "Erro na Alteração" + erro.getMessage());

    }
    conecta.desconecta(); //fecha conexão
}

Eu já retirei o ID do update coloquei o WHERE nome, mais sem sucesso, eu não queria deixar o campo Código aparecendo no Formulário, mais só está funcionando dessa maneira, seu retirar não atualiza, se coloco ai funciona. Obrigado.

public void atualizar(Contato contato) {
    conecta.conexao(); //Abre a conexão
    try {
        String sql = "UPDATE contato SET id=?, nome=?, sobrenome=? WHERE id=?";
        // String sql = "UPDATE contato SET id=?, nome=?, sobrenome=? WHERE nome=?";
        PreparedStatement pstm = conecta.conn.prepareStatement(sql);
        pstm.setInt(1, contato.getId());
        pstm.setString(2, contato.getNome());
        pstm.setString(3, contato.getSobrenome());
        //Onde está o parametro 4? pstm.setInt(4, contato.getId());
        //se for pelo nome pstm.setString(2, contato.getNome());
        pstm.execute(); // .executeUpdate(); ??

        JOptionPane.showMessageDialog(null, "Atualizado com Sucesso");

    } catch (SQLException erro) {
        JOptionPane.showMessageDialog(null, "Erro na Alteração" + erro.getMessage());

    }
    conecta.desconecta(); //fecha conexão
}

isso resolve seu problema?

Se eu não estiver enganado, o ID seria uma primary key, correto? logo, não se faz update nela.
Retire o id da tela, mande atualizar o contato e inspecione o Contato para ver se o id do contato esta preenchido.
Utilize no pstm o methodo .executeUpdate()

Correto o ID é chave primária, passa normalmente sem erro nenhum só que vou no banco conferir tá sem alteração nenhuma. hahaha

Caso o ID seja uma chave primária, não se pode altera-lo, pois é incrementado automaticamente pelo SGBD.

Outra coisa que posso reparar, é que você não está informando o parâmetro do id no seu where.
Ficaria algo como:

public void atualizar(Contato contato) {
    conecta.conexao(); //Abre a conexão
    try {
        String sql = "UPDATE contato SET nome=?, sobrenome=? WHERE id=?";
        PreparedStatement pstm = conecta.conn.prepareStatement(sql);
        pstm.setString(1, contato.getNome());
        pstm.setString(2, contato.getSobrenome());
        pstm.setInt(3, contato.getId());

        pstm.executeUpdate(); // executeUpdate toda vez que for utilizar DML (insert, update, delete)

        JOptionPane.showMessageDialog(null, "Atualizado com Sucesso");

    } catch (SQLException erro) {
        JOptionPane.showMessageDialog(null, "Erro na Alteração" + erro.getMessage());

    }
    conecta.desconecta(); //fecha conexão
}

OBS: levando em consideração de que o ID é uma chave primária e que não se pode altera-lo.