Fórum Inserir dados em varias tabelas com chaves estrangeiras com o PreparedStatement #520584

22/05/2015

0

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.



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

Bruno Oliveira

Responder

Posts

15/06/2015

Marisiana Battistella

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.
Responder

Gostei + 0

15/06/2015

Marisiana Battistella

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.
Responder

Gostei + 0

15/06/2015

Bruno Oliveira

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!
Responder

Gostei + 0

15/06/2015

Marisiana Battistella

Por nada Honorati!
Se tiver dúvidas, vá questionando... te ajudarei no que estiver ao meu alcance.
Responder

Gostei + 0

18/06/2015

Bruno Oliveira

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.

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
Responder

Gostei + 0

19/06/2015

Fernando C

se vc está usando essa tabela:
create table Pessoas(
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..
Responder

Gostei + 0

19/06/2015

Marisiana Battistella

É 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
SELECT MAX(ID) as id_pessoa FROM Pessoas
provavelmente ocorrerá um erro dizendo que a coluna ID não existe.
Responder

Gostei + 0

19/06/2015

Marisiana Battistella

E como ficou a estrutura dessas tabelas? Conseguiu incluir as Primary Key e Foreign Key ?
Responder

Gostei + 0

07/07/2015

Bruno Oliveira

O SQL ficou assim, mas mesmo assim não roda.

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)
);
Responder

Gostei + 0

07/07/2015

Marisiana Battistella

Então, o teu select tem que estar com o campo correto...
SELECT MAX(id_pessoa) as id_pessoa FROM Pessoas
Responder

Gostei + 0

08/07/2015

Fernando C

Olha, executei seu código (as 3 primeiras tabelas) e não deu problema não.
Responder

Gostei + 0

09/07/2015

Fernando C

complementando:
[img]http://arquivo.devmedia.com.br/forum/imagem/0-20150709-102841.jpg[/img]
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar