Inserção de dados

10 respostas
N

tenho o seguinto comando de inserção em duas tabelas referenciadas pelo campo ID_PESSOA

//insert na tabela TB_PESSOA
			SQL = "";
			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_FISICA
			SQL = "";
			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 !

alguem tem idéia?

10 Respostas

M

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

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

M

coloca o stacktrace ai

N
java.sql.SQLException: ORA-02291: integrity constraint (FK_PESSOA_FISICA) violated - parent key not found

	at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:125)
	at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:305)
	at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:272)
	at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:623)
	at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:181)
	at oracle.jdbc.driver.T4CPreparedStatement.execute_for_rows(T4CPreparedStatement.java:543)
	at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1028)
	at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:2888)
	at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:2960)
	at org.apache.tomcat.dbcp.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:101)
	at app.comuns.DBMbpu.executeUpdate(DBMbpu.java:140)
	at app.controle.CadastrarPfAction.unspecified(CadastrarPfAction.java:301)
	at org.apache.struts.actions.DispatchAction.dispatchMethod(DispatchAction.java:256)
	at org.apache.struts.actions.LookupDispatchAction.execute(LookupDispatchAction.java:160)
	at framework.controle.PlcBaseAction.execute(PlcBaseAction.java:3886)
	at app.controle.AppAction.execute(AppAction.java:163)
	at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:419)
	at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:224)
	at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1192)
	at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:430)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
	at framework.controle.PlcFiltroEncodeTomcat5.doFilter(PlcFiltroEncodeTomcat5.java:52)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
	at app.controle.AppFiltroGeral.doFilter(AppFiltroGeral.java:42)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:432)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869)
	at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664)
	at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
	at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
	at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
	at java.lang.Thread.run(Thread.java:595)
M

posta o método que contem essa linha e marca essa linha para sabermos que linha é: CadastrarPfAction.java:301

L

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

CadastrarPfAction.java:301 é a linha 20 do meu primeiro post . é um executeUpdate() normal do preparedStatement

N

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

usei o comando DEFERRABLE INITIALLY DEFERRED mas apenas adiou o erro. na hora do comit o erro acontece

L

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.

Criado 16 de março de 2010
Ultima resposta 16 de mar. de 2010
Respostas 10
Participantes 3