Inserir dados em varias tabelas com chaves estrangeiras com o PreparedStatement
Professores, boa tarde, pesquisei no forum e não encontrei nada parecido com minha duvida, então vamos a ela. Segue a parte do código onde eu faço a gravação dos dados no Banco de dados (utilizo o PostgreSQL). A tabela "pessoas" é a tabela "mestra" que linka com as outras, do tipo jurídico e físico. O problema é que as tabelas complementares, com chaves estrangeiras não são gravadas.
Os try e catchs comentados foi um filtro que fiz para ver se o programa chegava até lá... mas ele não entra lá.
Abaixo do código java está o código SQL, para melhor entendimento.
Os try e catchs comentados foi um filtro que fiz para ver se o programa chegava até lá... mas ele não entra lá.
Abaixo do código java está o código SQL, para melhor entendimento.
try {
//carregando o JDBC
Class.forName("org.postgresql.Driver");
//Construindo a conexão com banco de dados
Connection con = DriverManager.getConnection("jdbc:postgresql://localhost:5432/dados","postgres","12345");
JOptionPane.showMessageDialog(null, "Conectado");
PreparedStatement gravar = con.prepareStatement("Insert into Pessoas values(?,?,?,?)");
gravar.setString(1,jTCPF.getText());
gravar.setString(2, jTNome.getText());
gravar.setString(3, jTObservacoes.getText());
gravar.setString(4,"PessoaFisica");
gravar.executeUpdate();
//try{
gravar = con.prepareStatement("Insert into PessoaFisica values(?,?,?,?,?,?,?,?,?,?,?,?,?)");
gravar.setString(1, jTCPF.getText());
gravar.setString(2,jTRG.getText());
gravar.setString(3,jTOrgEmissor.getText());
gravar.setDate(4, (Date) jDDataEmissao.getDate());
gravar.setString(5,jTProfissao.getText());
gravar.setString (6,jCEstadoCivil.getToolTipText());
gravar.setString(7,jTnacionalidade.getText());
gravar.setString(8,jTNaturalidade.getText());
gravar.setString(9,jCEstadoNat.getToolTipText());
gravar.setDate(10, (Date) jDNascimento.getDate());
gravar.setString(11, jTAtendente.getText());
gravar.executeUpdate();
//}catch (SQLException ex){
//JOptionPane.showMessageDialog(null, "Erro nos dados básicos informados: "+ex.getMessage());
//}
//try{
gravar = con.prepareStatement("Insert into EnderecoPessoa values(?,?,?,?,?,?,?,?,?)");
gravar.setString(1,jTCPF.getText());
gravar.setString(2, jCLogradouro.getToolTipText());
gravar.setString(3,jTLogradouro.getText());
gravar.setString(4,jTNumero.getText());
gravar.setString(5, jTComplemento.getText());
gravar.setString(6,jTBairro.getText());
gravar.setString(7,jTCidade.getText());
gravar.setString(8,jCEstado.getToolTipText());
gravar.setString(9,jTCEP.getText());
//}catch (SQLException ex){
//JOptionPane.showMessageDialog(null, "Erro nos campos de endereço: "+ex.getMessage());
//}
//try{
gravar = con.prepareStatement("Insert into ContatoPessoa values(?,?,?,?,?,?,?,?)");
gravar.setString(1,jTCPF.getText());
gravar.setString(2,jCTipo1.getToolTipText());
gravar.setString(3,jTTel1.getText());
gravar.setString(4,jCTipo2.getToolTipText());
gravar.setString(5,jTTel2.getText());
gravar.setString(6,jCtipo3.getToolTipText());
gravar.setString(7,jTTel3.getText());
gravar.setString(8,jTEmail.getText());
gravar.executeUpdate();
//}catch (SQLException ex){
//JOptionPane.showMessageDialog(null, "Erro nos campos de contato: "+ex.getMessage());
//}
}catch (SQLException ex){
JOptionPane.showMessageDialog(null, "ERRO SQL: "+ex.getMessage());
}catch (ClassNotFoundException ex){
JOptionPane.showMessageDialog(null, "ERRO CLASSE: "+ex.getMessage());
}create table Pessoas( CPF_CNPJ varchar (14) primary key not null, Nome varchar(40)not null, Observacoes varchar(1500), Tipo varchar(14) ); create table PessoaFisica( CPF varchar(14) primary key not null, RG varchar(12)not null, Org_emissor varchar(10)not null, Data_emiss date, Profissao varchar(15)not null, Estado_civil varchar(12)not null, Nacionalidade varchar(12)not null, Naturalidade varchar(20)not null, Estado_nat varchar(2)not null, Nascimento date, Atendente varchar(12) not null, Documentos OID, foreign key (CPF) references Pessoas(CPF_CNPJ) ); create table PessoaJuridica( CNPJ varchar(14)primary key not null, Nome_fantasia varchar(40), Pessoa_responsavel varchar(15), Insc_estadual varchar(14), Insc_municipal varchar(10), foreign key (CNPJ) references Pessoas(CPF_CNPJ) ); create table EnderecoPessoa( Pessoa varchar(14) primary key not null, Logradouro varchar (12) not null, Nome_logradouro varchar(20) not null, Numero varchar(10) not null, Complemento varchar(20)not null, Bairro varchar(20) not null, Cidade varchar(20) not null, Estado varchar(2) not null, CEP varchar(10), foreign key (Pessoa) references Pessoas(CPF_CNPJ) ); create table ContatoPessoa( Pessoa varchar(14) primary key not null, Tipo1 varchar(12) not null, Telefone1 varchar (15)not null, Tipo2 varchar (12), Telefone2 varchar(15), Tipo3 varchar (12), Telefone3 varchar(15), Email varchar(20), foreign key (Pessoa) references Pessoas(CPF_CNPJ) );
Bruno Oliveira
Curtidas 0
Respostas
Marisiana Battistella
22/05/2015
Tem um detalhe na estrutura das tabelas... A definição da estrutura não está correta, pois você não criou Foreign Key em nenhuma das tabelas.
Você está utilizando o campo CPF_CNPJ como Primary Key e está definindo um campo pessoa como Primary Key nas demais tabelas.
O campo CPF_CNPJ deve ser um atributo da tabela pessoa que deverá ser único, não podendo haver duplicidade dessa informação.
Para criar as Primary Key nas tabelas, utilize sempre um campo sequencial do tipo integer e defina ele como Primary Key.
Cada tabela deve possui o seu campo sequencial e você pode segui um padrão, como poe exemplo: idpessoa, idpessoafisica, idpessoajuridica, idendereco, idcontato,...
Nas tabelas que referenciam a pessoa (PessoaFisica, PessoaJuridica, EnderecoPessoa, ContatoPessoa) você irá utilizar o campo identificador da tabela pessoa (idpessoa) e irá definí-lo como Foreign Key referenciando o idpessoa da tabela pessoa.
Assim você criará o vinculo correto entre as tabelas.
Você está utilizando o campo CPF_CNPJ como Primary Key e está definindo um campo pessoa como Primary Key nas demais tabelas.
O campo CPF_CNPJ deve ser um atributo da tabela pessoa que deverá ser único, não podendo haver duplicidade dessa informação.
Para criar as Primary Key nas tabelas, utilize sempre um campo sequencial do tipo integer e defina ele como Primary Key.
Cada tabela deve possui o seu campo sequencial e você pode segui um padrão, como poe exemplo: idpessoa, idpessoafisica, idpessoajuridica, idendereco, idcontato,...
Nas tabelas que referenciam a pessoa (PessoaFisica, PessoaJuridica, EnderecoPessoa, ContatoPessoa) você irá utilizar o campo identificador da tabela pessoa (idpessoa) e irá definí-lo como Foreign Key referenciando o idpessoa da tabela pessoa.
Assim você criará o vinculo correto entre as tabelas.
GOSTEI 0
Marisiana Battistella
22/05/2015
Talvez você esteja se questionando porque não pode utilizar o campo CPF_CNPJ como identificador da tabela Pessoa.
Não é uma boa prática fazer isso, pois, por ser um campo VARCHAR, ele irá comprometer a performance das consultas.
Não é uma boa prática fazer isso, pois, por ser um campo VARCHAR, ele irá comprometer a performance das consultas.
GOSTEI 0
Bruno Oliveira
22/05/2015
Bom dia Marisiana, que bom que você respondeu meu tópico.
Bom, eu vou tentar o que você disse no primeiro post, e então eu posto o resultado.
Abraços!
Bom, eu vou tentar o que você disse no primeiro post, e então eu posto o resultado.
Abraços!
GOSTEI 0
Marisiana Battistella
22/05/2015
Por nada Honorati!
Se tiver dúvidas, vá questionando... te ajudarei no que estiver ao meu alcance.
Se tiver dúvidas, vá questionando... te ajudarei no que estiver ao meu alcance.
GOSTEI 0
Bruno Oliveira
22/05/2015
Marisiana, fiz aqui como você me sugeriu.
Porém eu creio que essa parte do codigo está errada, pois aparece o seguinte código, "Erro SQL: Nenhum valor especificado para parâmetro 1.
Não sei o porque do erro
Porém eu creio que essa parte do codigo está errada, pois aparece o seguinte código, "Erro SQL: Nenhum valor especificado para parâmetro 1.
sql = "SELECT MAX(ID) as id_pessoa FROM Pessoas";
PreparedStatement stmt = con.prepareStatement(sql);
ResultSet rs = stmt.executeQuery();
rs.next();
int lastId = rs.getInt("id_pessoa");
rs.close();
stmt.close();
Não sei o porque do erro
GOSTEI 0
Fernando C
22/05/2015
se vc está usando essa tabela:
não há a coluna "ID".. verifique..
create table Pessoas(
CPF_CNPJ varchar (14) primary key not null,
Nome varchar(40)not null,
Observacoes varchar(1500),
Tipo varchar(14)
);
CPF_CNPJ varchar (14) primary key not null,
Nome varchar(40)not null,
Observacoes varchar(1500),
Tipo varchar(14)
);
não há a coluna "ID".. verifique..
GOSTEI 0
Marisiana Battistella
22/05/2015
É o que o Fabiano comentou Honorati....
Você pediu pra selecionar uma informação de um campo que não existe.
Se você executar esse código no banco de dados provavelmente ocorrerá um erro dizendo que a coluna ID não existe.
Você pediu pra selecionar uma informação de um campo que não existe.
Se você executar esse código no banco de dados
SELECT MAX(ID) as id_pessoa FROM Pessoas
GOSTEI 0
Marisiana Battistella
22/05/2015
E como ficou a estrutura dessas tabelas? Conseguiu incluir as Primary Key e Foreign Key ?
GOSTEI 0
Bruno Oliveira
22/05/2015
O SQL ficou assim, mas mesmo assim não roda.
Desculpem a demora, estive ausente de internet por uns dias
Desculpem a demora, estive ausente de internet por uns dias
create table Pessoas( id_pessoa serial primary key not null, CPF_CNPJ varchar (14) unique not null, Nome varchar(40)not null, Observacoes varchar(1500), Tipo varchar(14) ); create table PessoaFisica( id_pessoa serial primary Key not null, RG varchar(12)not null, Org_emissor varchar(10)not null, Data_emiss date, Profissao varchar(15)not null, Estado_civil varchar(12)not null, Nacionalidade varchar(12)not null, Naturalidade varchar(20)not null, Estado_nat varchar(2)not null, Nascimento date, Atendente varchar(12) not null, Documentos OID, foreign key (id_pessoa) references Pessoas(id_pessoa) ); create table PessoaJuridica( id_pessoa serial primary key not null, Nome_fantasia varchar(40), Pessoa_responsavel varchar(15), Insc_estadual varchar(14), Insc_municipal varchar(10), foreign key (id_pessoa) references Pessoas(id_pessoa) ); create table EnderecoPessoa( id_pessoa serial primary key not null, Logradouro varchar (12) not null, Nome_logradouro varchar(20) not null, Numero varchar(10) not null, Complemento varchar(20)not null, Bairro varchar(20) not null, Cidade varchar(20) not null, Estado varchar(2) not null, CEP varchar(10), foreign key (id_pessoa) references Pessoas(id_pessoa) ); create table ContatoPessoa( id_pessoa serial primary key not null, Tipo1 varchar(12) not null, Telefone1 varchar (15)not null, Tipo2 varchar (12), Telefone2 varchar(15), Tipo3 varchar (12), Telefone3 varchar(15), Email varchar(20), foreign key (id_pessoa) references Pessoas(id_pessoa) ); create table AlteracoesFisica( id_pessoa serial primary key not null, User_insercao varchar(10)not null, User_alteracao varchar(10), Numero_alteracoes int, foreign key (id_pessoa) references Pessoas(id_pessoa) ); create table Advogado( id_pessoa serial primary key not null, CPF varchar (11) unique not null, Nome varchar(40)not null, OAB varchar(12)not null, Estado_Emiss char(2), Data_emiss date, Especialização varchar(15)not null, Estado_civil varchar(12)not null, Nacionalidade varchar(12)not null, Naturalidade varchar(20), Estado_nat varchar(2), Nascimento date, Observacoes varchar(1500) ); create table EnderecoAdvogados( id_pessoa serial primary key not null, Logradouro varchar (12) not null, Nome_logradouro varchar(20) not null, Numero varchar(10) not null, Complemento varchar(20)not null, Bairro varchar(20) not null, Cidade varchar(20) not null, Estado varchar(2) not null, CEP varchar(10), foreign key (id_pessoa) references Advogado(id_pessoa) ); create table ContatoAdvogado( id_pessoa serial primary key not null, Tipo1 varchar(12) not null, Telefone1 varchar (15)not null, Tipo2 varchar (12), Telefone2 varchar(15), Tipo3 varchar (12), Telefone3 varchar(15), Email varchar(20), foreign key (id_pessoa) references Advogado(id_pessoa) ); create table AlteracoesAdvogado( id_pessoa serial primary key not null, User_insercao varchar(10)not null, User_alteracao varchar(10), Numero_alteracoes int, foreign key (id_pessoa) references Advogado(id_pessoa) ); create table Processo( Autor varchar(14) primary key not null, Reu varchar(14) not null, Num_processo varchar(20) not null, Comarca varchar(20) not null, Estado varchar(2), Vara varchar(25) not null, Tipo_processo varchar(10), Tipo_acao varchar(10), Adv_responsavel varchar(11), Observacoes varchar(1500), Data_inclusao date not null, Valor_pedido real not null, Data_audiencia date, Acordo varchar(3), Julgado varchar(3), Valor_acordo_sentenca real, Status varchar(9), Desfecho varchar(15), foreign key (Autor) references Pessoas(CPF_CNPJ), foreign key (Reu) references Pessoas(CPF_CNPJ), foreign key (Adv_responsavel) references Advogado(CPF) );
GOSTEI 0
Marisiana Battistella
22/05/2015
Então, o teu select tem que estar com o campo correto...
SELECT MAX(id_pessoa) as id_pessoa FROM Pessoas
GOSTEI 0
Fernando C
22/05/2015
Olha, executei seu código (as 3 primeiras tabelas) e não deu problema não.
GOSTEI 0
Fernando C
22/05/2015
complementando:
[img]http://arquivo.devmedia.com.br/forum/imagem/0-20150709-102841.jpg[/img]
[img]http://arquivo.devmedia.com.br/forum/imagem/0-20150709-102841.jpg[/img]
GOSTEI 0