Problema ao passar dados a query

4 respostas
newuser

Olá amigos que falam Javanês!

Tenho a classe Cadastro com atributo do tipo classe Municipio e preciso passar a id desse municipio para uma query e
quando eu executo dá a seguinte mensagem:

ERRO: inserção ou atualização em tabela “cadastro” viola restrição de chave estrangeira “fk_cadastro_municipio”
Detalhe: Chave (cad_munid)=(0) não está presente na tabela “municipio”.

O método que contém a query é o seguinte:

public boolean alterar(Usuario usuario) throws SQLException{
    	try {
    		conexao = Conexao.conectar();
    		conexao.setAutoCommit(false);

    		StringBuffer sql1 = new StringBuffer();
    		StringBuffer sql2 = new StringBuffer();
    		
    		sql1.append("UPDATE cadastro SET ");
    		sql1.append("cad_nome=?, ");
    		sql1.append("cad_email=?, ");
    		sql1.append("cad_telefone=?, ");
    		sql1.append("cad_cnpjcpf=?, ");
    		sql1.append("cad_rg=?, ");
    		sql1.append("cad_rua=?, ");
    		sql1.append("cad_complemento=?, ");
    		sql1.append("cad_numero=?, ");
    		sql1.append("cad_bairro=?, ");
    		sql1.append("cad_munid=?, ");
    		sql1.append("cad_cep=?, ");
    		sql1.append("cad_obs=? ");
    		sql1.append("where cad_id=? ");
    		PreparedStatement consulta1 = conexao.prepareStatement(sql1.toString());
    		usuario.setMunicipio(new Municipio());
    		consulta1.setString(1, usuario.getNome());
    		consulta1.setString(2, usuario.getEmail());
    		consulta1.setString(3, usuario.getTelefone());
    		consulta1.setString(4, usuario.getCnpjCpf());
    		consulta1.setString(5, usuario.getRg());
    		consulta1.setString(6, usuario.getRua());
    		consulta1.setString(7, usuario.getComplemento());
    		consulta1.setString(8, usuario.getNumero());
    		consulta1.setString(9, usuario.getBairro());
    		consulta1.setInt(10, usuario.getMunicipio().getId());
    		consulta1.setString(11, usuario.getCep());
    		consulta1.setString(12, usuario.getObs());
    		consulta1.setInt(13, usuario.getId());
    		consulta1.executeUpdate();
    		
    		sql2.append("UPDATE usuario SET usu_login = ?, usu_senha = ?, usu_sts = ? WHERE usu_id = ?");
    		PreparedStatement consulta2 = conexao.prepareStatement(sql2.toString());
    		consulta2.setString(1, usuario.getLogin());
            consulta2.setString(2, usuario.getSenha());
            consulta2.setString(3, usuario.getStatus());
            consulta1.setInt(4, usuario.getId());
    		consulta2.executeUpdate();
    		
    		conexao.commit();
    		System.out.println("Transaction commit...");
    		conexao.setAutoCommit(true);
    		return true;
		   } catch (Exception e) {
			 if(conexao!=null){
			    conexao.rollback();
			    System.out.println("Connection rollback...");
			}
			e.printStackTrace();
			return false;
		}
    }

Acho que o problema é esta linha:

consulta1.setInt(10, usuario.getMunicipio().getId());

Quem puder me ajudar, será de grande valia, pois sou iniciante e este projeto está atrasado.

4 Respostas

kiko_lp_St_jimmy

Cara é bem simples a sua tabela cadastro tem relacionamento com a tabela município, isto é pra você incluir um registro na tabela cadastro o mesmo tem que constar na tabela município que será identificado pelo campo cad_munid .
No seu caso você ta passando esta campo com valor 0.
Se você prestar atenção na linha 24 você tem o seguinte trecho:

usuario.setMunicipio(new Municipio());

Ou seja quando você tenta recuperar o valor na linha 34 :

consulta1.setInt(10, usuario.getMunicipio().getId());

Nesse caso o Id estará vazio ou null.

newuser

Sql1 foi, agora tá dando erro na sql2 com a mensagem:

org.postgresql.util.PSQLException: Nenhum valor especificado para parâmetro 4.

mas eu passei o id do usuario como parâmetro sim.

O que eu faço?

kiko_lp_St_jimmy

Novamente é tudo questão de olhar um pouco o código que você escreveu.

Se prestar atenção verá que na linha 45 você está setando o 4 parâmetro na consulta1 e não na consulta2.

consulta2.setString(3, usuario.getStatus()); consulta1.setInt(4, usuario.getId());

Eu sei que no começo é complicado mesmo mas quase sempre é questão de revisar um pouco melhor o código.

Abs

newuser

Obrigado cara! Foi só erro de digitação e eu achando que era alguma coisa com a classe municipio.
Valeu mesmo!

Criado 2 de fevereiro de 2012
Ultima resposta 3 de fev. de 2012
Respostas 4
Participantes 2