não consigo adionar dado no banco com tabelas relacionadas

10 respostas
IsaelCoelho

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

guivirtuoso

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

IsaelCoelho

obrigado pela dica guivirtuoso consertei aqui e tenho novo erro

IsaelCoelho

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.

guivirtuoso

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:

IsaelCoelho

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)
guivirtuoso

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.

IsaelCoelho

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.

Gabriellf

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

IsaelCoelho

sim Grabiel desta forma.

Gabriellf

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