tenho o seguinto comando de inserção em duas tabelas referenciadas pelo campo ID_PESSOA
//insert na tabela TB_PESSOASQL="";SQL="insert into TB_PESSOA (ID_PESSOA, STATUS) "+"values (?,?)";pstm=dataSource.getPreparedStatement(SQL);i=1;pstm.setLong(i++,idPessoa);pstm.setBoolean(i++,Status);pstm.executeUpdate();pstm.close();//insert na tabela TB_PESSOA_FISICASQL="";SQL="insert into TB_PESSOA_FISICA (ID_PESSOA, CPF) "+"values (?,?)";pstm=dataSource.getPreparedStatement(SQL);i=1;pstm.setLong(i++,idPessoa);pstm.setLong(i++,cpf);pstm.executeUpdate();pstm.close();
Ao dar o segundo executeUpdate() o java me lança um exceção assim :
integrity constraint (FK_PESSOA_FISICA) violated - parent key not found
mas porque esse erro é lançado sendo que o primeiro executeUpdate grava a chava referenciada na foreignkey FK_PESSOA_FISICA
ja tentei setar o setAutoCommit(true) do dataSource sem sucesso !
ID_PESSOA é auto increment? Se sim, então vc passando idPessoa ali no pstm.setLong(i++, idPessoa) ta errado.
Outra coisa o erro quer dizer que vc não tem o ID_PESSOA gravado na tabela de referência Pessoa, o seu código não está retornando o Id inserido em TB_PESSOA antes de fazer a referencia em TB_PESSOA_FISICA. Entendeu o problema?
N
ninjasauro
entendi o problema sim… e é examente por isso que não entendi o erro
o campo idPessoa não é auto incremet. eu gero ele na mão atraves de um sequence.
o idPessoa vai preenchido normalmente nos doois executeUpdate(). Então teoricamente a tabela TB_PESSOA ja estaria que estar com o ID_PESSOA preenchido
não consigo entender pq não acha a chave sendo que ela já está teoricamente gravada
posta o método que contem essa linha e marca essa linha para sabermos que linha é: CadastrarPfAction.java:301
L
lvffilho
Na hora da criação da FK adicione os seguintes comandos no script.
“deferrable initially deferred”
Isso vai fazer a validação da FK somente na hora do commit.
Att,
N
ninjasauro
CadastrarPfAction.java:301 é a linha 20 do meu primeiro post . é um executeUpdate() normal do preparedStatement
N
ninjasauro
pra usar o DEFERRABLE INITIALLY DEFERRED eu precisaria alterar a FK né? eu não tenho acesso a esse tipo de serviço aqui.
N
ninjasauro
usei o comando DEFERRABLE INITIALLY DEFERRED mas apenas adiou o erro. na hora do comit o erro acontece
L
lvffilho
Então o dado da tabela pessoa não esta sendo inserido.
Ou o valor está indo nulo.
Logo que você deu o INSERT, faça um SELECT pra ver se está no banco então.