não consigo adionar dado no banco com tabelas relacionadas

10 respostas
I

boa noite tenho que adicionar uma id de uma tabela que que vem de outra como fk mas não estou conseguindo gostaria que me ajudassem segue abaixo meu código e se alguém tiver uma forma mais elegante em um exemplo gostaria de ver ok.

` /*Cliente clie = new Cliente();
Date d = new Date();

clie.setNome("Gabriel Yosef");
    clie.setNascimemto(d);
    clie.setRg(1234);
    clie.setCpf(749671687);
    
    ClienteDao dao = new ClienteDao();
    dao.Cadastar(clie);
    */
    
    
        ClienteDao clientedao = new ClienteDao();
        
        Cliente cli = clientedao.buscaPorcpf(749671687);
        
        Integer n =cli.getId();

Endereco end = new Endereco();
    
        end.setRua("acapu");
        end.setNumero(23);
        end.setBairro("aeroporto");
        end.setEstado("pará");
        end.setCep(123);
        end.setObservsacao("cadastro novo");
        end.setCliente(n);
        
        EnderecoDao enderecodao = new EnderecoDao();
     
        enderecodao.CadastarEndereco(end);

`

esta é minha classe clientedao

`package br.com.clinicaAlmeida.jdbc;

import java.sql.Connection;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;

import br.com.clinicaAlmeida.entity.Cliente;

public class ClienteDao {

Connection con = Conexao.getConnection();

public void Cadastar(Cliente cliente){
    
    String sql = "INSERT INTO clientes (nome, nascimemto, rg, cpf) VALUES (?,?,?,?)";
    
    try{
        PreparedStatement stm = con.prepareStatement(sql);
        
        stm.setString(1, cliente.getNome());
        stm.setDate(2, new java.sql.Date(cliente.getNascimemto().getTime()));
        stm.setInt(3, cliente.getRg());
        stm.setInt(4, cliente.getCpf());
        
        stm.execute();
        stm.close();
        System.out.println("Gravado com sucesso!!");
    
    }catch(SQLException e){
        
        e.printStackTrace();
        
    }
}

public Cliente buscaPorcpf(int cpf){
    String sql = "SELECT *FROM CLIENTES WHERE cpf=?";
    Cliente cliente = null;
    try {
        PreparedStatement stm = con.prepareStatement(sql);
        stm.setInt(1, cpf);
        
        ResultSet rs = stm.executeQuery();
        if(rs.next()){
        cliente = new Cliente();
        cliente.setId(rs.getInt("id"));
        cliente.setNome(rs.getString("nome"));
        cliente.setNascimemto(rs.getDate("nascimemto"));
        cliente.setRg(rs.getInt("rg"));
        cliente.setCpf(rs.getInt("cpf"));
        
        
        }
    } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return cliente;
}

}
`
esta ultima é a minha classe enderecodao

`package br.com.clinicaAlmeida.jdbc;

import java.sql.Connection;

import java.sql.PreparedStatement;

import java.sql.SQLException;

import br.com.clinicaAlmeida.entity.Endereco;

public class EnderecoDao {
Connection con = Conexao.getConnection();

public void CadastarEndereco(Endereco endereco){
    
    String sql = "INSERT INTO endereco (id, rua, numero, bairro, estado, cep, observacao) VALUES (?,?,?,?,?,?,?)";
    
    try{
        PreparedStatement stm = con.prepareStatement(sql);
        
        stm.setString(1, endereco.getRua());
        stm.setInt(2, endereco.getNumero());
        stm.setString(3, endereco.getBairro());
        stm.setString(4, endereco.getEstado());
        stm.setInt(5, endereco.getCep());
        stm.setString(6, endereco.getObservsacao());
        stm.setInt(7, endereco.getCliente());
        
        stm.execute();
        stm.close();
    
    }catch(SQLException e){
        
        e.printStackTrace();
        
    }
}

}

`
e esse é o erro que tenho:
org.postgresql.util.PSQLException: ERROR: column “id” is of type integer but expression is of type character varying
Dica: You will need to rewrite or cast the expression.
Posição: 81

10 Respostas

G

Bom de cara assim olhando seu SQL de insert de enderecos ta errado.

Suas colunas não casam com a ordem dos parametros que você informou.

Ex: o primeiro campo deveria ser um ID (Acredito que vc se equivocou pq deve estar desejando que esse numero seja gerado automaticamente), mas de qualquer forma você informou o nome da rua.

E no ultimo parametro, depois de observacoes, deveria ter o id_cliente e não tem.

Mas antes de tudo isso, você está me dizendo que o Endereço possui um cliente?

Quem é o dado mais importante ai? O Endereço ???
Acredito que você também deva dar uma olhadinha na sua modelagem… geralmente o Cliente que possui endereço… mas enfim… é soh um ponto de vista… atente-se às colunas do seu SQL em relacao aos parametros que você está passando… estão incorretos.

ABs

I

obrigado pela dica guivirtuoso consertei aqui e tenho novo erro

I

veja como ficou minha classe ClienteDao

`public class ClienteDao {

Connection con = Conexao.getConnection();

public void Cadastar(Cliente cliente){
    
    String sql = "INSERT INTO clientes (nome, nascimemto, rg, cpf) VALUES (?,?,?,?)";
    
    try{
        PreparedStatement stm = con.prepareStatement(sql);
        
        stm.setString(1, cliente.getNome());
        stm.setDate(2, new java.sql.Date(cliente.getNascimemto().getTime()));
        stm.setInt(3, cliente.getRg());
        stm.setInt(4, cliente.getCpf());
        stm.setInt(5, cliente.getEndereco().getId());
        
        
        stm.execute();
        stm.close();
        System.out.println("ClienteGravado com sucesso!!");
    
    }catch(SQLException e){
        
        e.printStackTrace();
        
    }
}

}`

veja como ficou o teste

`public class test {

public static void main(String[] args) {
        
Endereco end = new Endereco();
    
        end.setRua("xxxx");
        end.setNumero(1111);
        end.setBairro("dkdjdkd");
        end.setEstado("skjs");
        end.setCep(123);
        end.setObservsacao("cadastro novo");
        
        
        EnderecoDao enderecodao = new EnderecoDao();
     
        enderecodao.CadastarEndereco(end);
        
    
    
    Cliente clie = new Cliente();
    Date d = new Date();
            
            clie.setNome("Gabriel Yosef");
            clie.setNascimemto(d);
            clie.setRg(1234);
            clie.setCpf(749671687);
            clie.setEndereco(end);
            ClienteDao dao = new ClienteDao();
            dao.Cadastar(clie);

}
}

`

se alguém poder me ajudar agradesço.

G

Você ainda está comentendo o mesmo erro em relacao ao SQL.

Você tem 4 parametros sendo esperados:

String sql = "INSERT INTO clientes (nome, nascimemto, rg, cpf) VALUES (?,?,?,?)";

e você está tentando informar 5:

stm.setString(1, cliente.getNome());
stm.setDate(2, new java.sql.Date(cliente.getNascimemto().getTime()));
stm.setInt(3, cliente.getRg());
stm.setInt(4, cliente.getCpf());
stm.setInt(5, cliente.getEndereco().getId());

:frowning:

I

corrigir isso e fiquei com esse erro:

Endereco gravado com Sucesso!!

Exception in thread main java.lang.NullPointerException

at br.com.clinicaAlmeida.jdbc.ClienteDao.Cadastar(ClienteDao.java:25)

at br.com.clinicaAlmeida.test.test.main(test.java:41)
G

Você ta recebendo um NullPointer cara… debugue seu código e veja qq ta acontecendo na linha 25.

Voce esta tentando manipular alguma referencia que esta nula.

I

fiz o the bug aqui e realmente o id endereco está vindo nulo gostaria de ver um exemplo de para inserir dado em tabelas diferentes no mesmo formulario usando jdbc.

G

Com “mesmo formulário” você quer dizer uma mesma tela, e, dessa tela, mandar os dados para o JDBC?

I

sim Grabiel desta forma.

G

No seu caso, acho que você poderia simplismente colocar os campos de endereço juntos aos do cliente, e no seu código atribuir cada um ao seu devido objeto. Mas acho que seu problema é que você não está pegando o id gerado da tabela endereço (isso se o campo id está definido com um valor default, como o auto_increment no MySQL ou serial no PostgreSQL). Para o caso do campo id, da tabela de endereços, ser auto incrementado, você pode usar o PreparedStatement.RETURN_GENERATED_KEYS, junto a sua SQL; depois só pegar esse valor gerado. Lembrando que, para associar o id de um endereço, o mesmo deve ser inserido no banco antes do cliente; então sugiro você criar um “EnderecoDAO”, que possui um método cadastrar que retorna o id cadastrado. Dentro desse método ficaria algo parecido com isso:

String sql = "INSERT INTO endereco...";
PreparedStatement stm = con.prepareStatement(sql, PreparedStatement.RETURN_GENERATED_KEYS);
//código para inserir o endereço

ResultSet rs = stm.getGeneratedKeys();

Integer id = null;
if(rs.next()){
     //só retornar esse id e atribuir ao endereço que está no cliente...
     id = rs.getInt("id");
}
Criado 19 de janeiro de 2016
Ultima resposta 20 de jan. de 2016
Respostas 10
Participantes 3