Problema ao setar codigo na foreign key

10 respostas
D

Bom dia pessoal sou novato em java e estou com um probleminha, o seguinte tenho uma classe fornecedor e uma classe midia, a classe midia tem um atributo do tipo fornecedor, ex

private int codigo;
private Fornecedor fornecedor;

eu fiz o seguinte fiz uma consulta no banco e joguei dentro de um jcombobox os dados de fornecedor

public void CarregarFornecedores() {
        jcFornecedorMidia.addItem("Selecione ..");
        CRUD_Midia midia = new CRUD_Midia();
        for (int i = 0; i < midia.carregarFornecedor().size(); i++) {
            jcFornecedorMidia.addItem(midia.carregarFornecedor().get(i).getNome());
        }

Minha duvida é como gravar o fornecedor que é uma foreign key na tabela midia, eu ate o momento pega o nome do fornecedor que estava no jcombobox, mas o metodo setFornecedor espera um objeto do tipo fornecedor.

Obs no banco ele é do tipo int para receber o codigo do fornecedor.

grato.

10 Respostas

Richard_Mendes_Madur

Acredito que você terá que criar um método que obtenha a instancia do objeto Fornecedor no banco de dados a partir do seu nome.
Aí é só setar o atributo no objeto CRUD_Midia que foi criado.

Espero ter ajudado!

D

richard deixa eu ver se eu entendi
a CRUD_Midia passa os paramentros pro banco. o certo é criar um metodo que recebe a instancia de fornecedor e passo-lo na crud
exemplo assim

public int PegarId(Forncedor forn)

{

int IdFornecedor = forn.getCodigo();

}
e na CRUD_Midia no lugar de inserir o fornecedor eu usuarei PegarId(fornecedor)

é isso que entendi
grato

E

Bom amigo eu ja tive esse problema e a solução que encontrei na net foi fazer um metódo que pegasse o item selecionado e fizesse um Cast do tipo da classe para poder conseguir pegar o ID e dai na hora de gravar passar o ID que você pegou da ComboBox veja um exemplo abaixo, está como String porque eu estou tratando a ComboBox porque no meu caso ela não pode ser vazia como é uma FK:

public String pesquisaCodigoComboBoxRelatorioCdPais(String cdPais) {
        
        try {
            
            Pais pais = (Pais)jComboBoxRelatorioEstadoCdPais.getSelectedItem();
            cdPais = (String.valueOf(pais.getCdPais()));

        } catch (Exception e) {
            //JOptionPane.showMessageDialog(null, "O campo (País) é um campo obrigatório", "Relatório - Estado", 1);
        }
        return cdPais;
    }
D

entendi mas uma pergunta a classe bean recebe um fornecedor do tipo fornecedor se eu passar essa sua solução vai dar certo pois esta esperando um objeto do tipo fornecedor
grato

E

Sim vai da certo no caso é so você passar o Objeto por exemplo no meu caso aqui como eu fiz:

String cdPais = ""; //Variável Que Recebe O País
            cdPais = pesquisaCodigoComboBoxCadastroCdPais(cdPais); //Pesquisando O Item Que Está Selecionado Na ComboBox - Pegando O ID

            Estado estado = new Estado(); 
            Pais pais = new Pais();

            estado.setNoEstado(jTextFieldCadastroEstadoNoEstado.getText()); // Setando Os Valores No Modelo
            estado.setUfEstado(jTextFieldCadastroEstadoUFEstado.getText());
            pais.setCdPais(Integer.parseInt(cdPais));
            estado.setCdPais(pais);

            MEstadoCRUD mEstadoCRUD = new MEstadoCRUD();
            mEstadoCRUD.estadoCadastrar(estado); // Passando O Modelo Para O CRUD

É importante que você tenha criado getters e setter para o seu Modelo.

Assim você pode pegar os valores depois, dando por exemplo:

pais.getCdPais();
            pais.getNoPais();
D

Parceiro ainda não deu certo mas acho q é facil
olha meu codigo

public void CarregarAtores() {
        jcDiretorMidia.addItem("Selecione ..");
        CRUD_Midia midia = new CRUD_Midia();
        for (int i = 0; i < midia.carregarAtor().size(); i++) {
            jcAtorMidia.addItem(midia.carregarAtor().get(i).getNome());
        }
    }
Ator forn = new Ator();
        forn = (Ator) jcAtorMidia.getSelectedItem();
        forn.getCodigo();
        forn.getNome();

o seguinte se no metodo de CarregarAtores se eu tirar o getNome() do final funciona perfeito porem não da para visualizar no combo
gostaria de achar um jeito de visualizar o nome do Ator e add no Objeto forn;

grato

thiagof

Olá derb!

Cara eu programo para web e pode ser que o que eu escreva aqui não tenha nada a ver com swing mas no meu caso web, meus combobox possuem um rotulo e um valor por baixo dos panos…

seria tipo assim:

label = forn.getNome();
value = forn.getCodigo();

no caso de swing, eu acho que o value seria o seu objeto Fornecedor e o label seria renderizado por um objeto auxiliar passado ao combobox…

sacou?

eu acho que no seu caso, vc precisa de um objeto Renderer para falar para o seu combobox que ele deve apresentar o .getNome() do fornecedor ao invés de tantar apresentar o objeto como um todo no display dele.

dá uma olhada nisso: (Tá em ingles mais nada que um google tradutor não resolva :smiley: )
http://docs.oracle.com/javase/tutorial/uiswing/components/combobox.html#renderer

Para isso, acho que vc vai ter que criar uma classe que implemente esta interface Renderer:
http://docs.oracle.com/javase/7/docs/api/javax/swing/ListCellRenderer.html
(ou procurar por uma classe abstrata que resolva parte dos seus problemas para não precisar implementar a interface toda)

e depois é só adicionar o seu renderer no seu combobox assim:

jcAtorMidia.setRenderer(suaImplRenderer);

Ai vai de vc estudar como usar esse renderer para apresentar no display do combobox apenas o nome do fornecedor, mas internamente, guardar o objeto Fornecedor como um todo e na hora de recuperar o item selecionado no combo, vc usa aquele seu código com cast lá:

Ator forn = new Ator();  
forn = (Ator) jcAtorMidia.getSelectedItem();  
forn.getCodigo();  
forn.getNome();

caso vc consegua desse jeito, posta o resultado ai para a gente blz?!

E

Bom no meu caso para aparecer os dados na ComboBox eu fiz assim na hora de adicionar o item, eu tive que usar o modelo e no modelo tive que declarar o metodo toString(); para que funcionasse se não aparecia o endereço de memória.

Então no caso do meu modelo eu adicionei o método lá toString();

@Override
    public String toString() {
        return this.noPais;
    }

//Depois na hora de montar a ComboBox eu fiz assim

public JComboBox<Pais> inicializaComboBoxCadastroCdPais(JComboBox<Pais> jComboBoxCadastroEstadoCdPais) {
        
        ConexaoImobiliaria ci = new ConexaoImobiliaria();
        ci.criaConexao();

        String comando = "SELECT CDPAIS, NOPAIS FROM PAIS ORDER BY NOPAIS";

        PreparedStatement preparedStatement;
        ResultSet resultSet;

        jComboBoxCadastroEstadoCdPais.removeAllItems();

        try {

            preparedStatement = (PreparedStatement) ci.getConnection().prepareStatement(comando);
            resultSet = preparedStatement.executeQuery();
            
            //Observe Essa Parte Aqui, Fiz A Consulta No Banco E Olhe Como Estou Usando O addItem Estou Dando Um new Da Classe Que Vou Trazer Os Dados E Uso O Construtor.

            while (resultSet.next()) {
                int cdPais = resultSet.getInt("CDPAIS");
                String noPais = resultSet.getString("NOPAIS");
                
                jComboBoxCadastroEstadoCdPais.addItem(new Pais(cdPais, noPais));

            }
        } catch (SQLException e) {
            JOptionPane.showMessageDialog(null, "Erro: " + e, "Erro", 1);
        } finally {
            ci.fechaConexao();
        }
        return jComboBoxCadastroEstadoCdPais;
    }

Bom ve se isso te ajuda, caso coloque seu CRUD para min ver o que vc está fazendo pra min poder entender e te ajudar.

D

legal
vc é gente boa o seguinte deu eu explicar tenho um trabalho classico para fazer de uma video locadora o seguinte a parte dos cadastro unitarios ate agora ta legal ja fiz que é cadastro de fornecedor, cliente, ator e diretor, agora estou com o problema no cadastro de midia onde uma midia deve ter um fornecedor e varios atores e diretores esse combo que estou precisando é para setar o fornecedor e os diretores e os atores, o fornecedor como é unico eu fiz um combo onde ele vem todos os fornecedores ele seleciona e inseri isso na foreing key do fornecedor os do atores e diretores eu nem comecei ainda kkkkkk
olha meu codigo so midia não esta completo ainda

metodo de inserção da midia

public boolean inserirMidia(Midia bean) {

        boolean ret = false;
        try {
            String sql = ("INSERT INTO midia (titulo, genero, tipo, sinopse, quantidade, status, fornecedor_codigo_FK) "
                    + "VALUES ( ?,?,?,?,?,?,?,?,?,?,?,? ) ");

            pstmt = conn.prepareStatement(sql);
            pstmt.setString(1, bean.getTitulo());
            pstmt.setString(2, bean.getGenero());
            pstmt.setString(3, bean.getTipo());
            pstmt.setString(4, bean.getSinopse());
            pstmt.setInt(5, bean.getQuantidade());
            pstmt.setString(6, bean.getStatus());
            pstmt.setObject(7, bean.getFornecedor());

            int rs = pstmt.executeUpdate();
            if (rs > 0) {
                ret = true;
            }
        } catch (SQLException e) {
            System.out.println("Erro ao gravar registro no Banco de Dados:\n" + e.getMessage());
            ret = false;
        } finally {
            //fecha a conexao com o banco
            conecta.close();

        }
        return ret;
    }

por isso estava precisando do combo para inserir no atributo do forncedor

busca

public Midia buscarMidia(Integer cod) {
        try {
            String sql = "select  * from midia where codigo = ?";
            pstmt = conn.prepareStatement(sql);
            pstmt.setInt(1, cod.intValue());
            ResultSet rs = pstmt.executeQuery();

            while (rs.next()) {
                bean.setCodigo(rs.getInt("codigo"));
                bean.setTitulo(rs.getString("titulo"));
                bean.setGenero(rs.getString("genero"));
                bean.setTipo(rs.getString("tipo"));
                bean.setSinopse(rs.getString("sinopse"));
                bean.setAno(rs.getString("ano"));
                bean.setQuantidade(rs.getInt("quantidade"));
                bean.setStatus(rs.getString("status"));

            }
        } catch (SQLException e) {
            System.out.println("Erro ao gravar registro no Banco de Dados:\n" + e.getMessage());
        } finally {
            //fecha a conexao com o banco
            conecta.close();
        }
        return bean;

agora os codigo que carregam os dados dos atores e diretores e fornecedores

public ArrayList<Ator> carregarAtor() {

        ArrayList<Ator> lista = new ArrayList<Ator>();
        try {
            String sql = "select  * from ator ";
            pstmt = conn.prepareStatement(sql);


            ResultSet rs = pstmt.executeQuery();
            while (rs.next()) {
                Ator prod = new Ator();
                prod.setCodigo(rs.getInt("codigo"));
                prod.setNome(rs.getString("nome"));

                lista.add(prod);

            }
            pstmt.close();



        } catch (Exception e) {
            System.out.println("Erro no Banco de Dados");
        }





        return lista;

    }


    public ArrayList<Diretor> carregarDiretor() {

        ArrayList<Diretor> lista = new ArrayList<Diretor>();
        try {
            String sql = "select  * from diretor ";
            pstmt = conn.prepareStatement(sql);


            ResultSet rs = pstmt.executeQuery();
            while (rs.next()) {
                Diretor prod = new Diretor();
                prod.setCodigo(rs.getInt("codigo"));
                prod.setNome(rs.getString("nome"));

                lista.add(prod);

            }
            pstmt.close();



        } catch (Exception e) {
            System.out.println("Erro no Banco de Dados");
        }





        return lista;

    }


     public ArrayList<Fornecedor> carregarFornecedor() {

        ArrayList<Fornecedor> lista = new ArrayList<Fornecedor>();
        try {
            String sql = "select  * from fornecedor ";
            pstmt = conn.prepareStatement(sql);


            ResultSet rs = pstmt.executeQuery();
            while (rs.next()) {
                Fornecedor prod = new Fornecedor();
                prod.setCodigo(rs.getInt("codigo"));
                prod.setNome(rs.getString("nome"));
                prod.setNomeFantasia(rs.getString("nome_fantasia"));
                prod.setEndereco(rs.getString("endereco"));
                prod.setNumero(rs.getInt("numero"));
                prod.setBairro(rs.getString("bairro"));
                prod.setCep(rs.getString("cep"));
                prod.setCidade(rs.getString("cidade"));
                prod.setEstado(rs.getString("estado"));
                prod.setFone(rs.getString("fone"));
                prod.setFax(rs.getString("fax"));
                prod.setEmail(rs.getString("email"));
                prod.setCnpj(rs.getString("cnpj"));

                lista.add(prod);

            }
            pstmt.close();



        } catch (Exception e) {
            System.out.println("Erro no Banco de Dados");
        }





        return lista;

    }

ainda não testei sua ultima resposta pois estou no trabalho,

metodos de carregar no combos

public void CarregarFornecedores() {
        jcFornecedorMidia.addItem("Selecione ..");
        CRUD_Midia midia = new CRUD_Midia();
        for (int i = 0; i < midia.carregarFornecedor().size(); i++) {
            jcFornecedorMidia.addItem(midia.carregarFornecedor().get(i));
        }


    }
public void CarregarDiretores() {
        jcDiretorMidia.addItem("Selecione ..");
        CRUD_Midia midia = new CRUD_Midia();
        for (int i = 0; i < midia.carregarDiretor().size(); i++) {
            jcDiretorMidia.addItem(midia.carregarDiretor().get(i));
        }
    }
public void CarregarAtores() {
        jcAtorMidia.setModel(comboator);

        comboator.addElement("Selecione ..");
        CRUD_Midia midia = new CRUD_Midia();
       for (int i = 0; i < midia.carregarAtor().size(); i++) {
        jcAtorMidia.addItem(midia.carregarAtor().get(i));
  }
}

metodo de inserir salvar a midia

CRUD_Midia crud = new CRUD_Midia();
        Midia bean = new Midia();
        String mensagem = null;
        mensagem = ValidarCampos(bean);

        Fornecedor forn = new Fornecedor ();
        forn = (Fornecedor ) jcAtorMidia.getSelectedItem();
        
        bean.setCodigo(forn.getCodigo);

        if (mensagem.equals("")) {

            crud.inserirMidia(bean);
            JOptionPane.showMessageDialog(this, "Arquivo salvo com sucesso!!!", "Arquivo Salvo", JOptionPane.INFORMATION_MESSAGE);
        } else {
            JOptionPane.showMessageDialog(this, "O(s) Campo(s)" + mensagem + " �/São Inválido(s)", "Erro", JOptionPane.ERROR_MESSAGE);
        }

esse é o que estou trabalhando
Obs empaquei ai e esta faltando bastante coisa

quero tambem perguntar uma coisa depois do fornecedor quero inserir uma lista de atores e diretores e estou usandoo componente jList para preencher fiz o mesmo esquema do fornecedor minha duvida é na hora de jogar isso para gravar na classe associativa tambem, mas vou me focar em partes

hum a bean tambem da uma olhada

public class Midia implements java.io.Serializable {

    private int codigo;
    private Fornecedor fornecedor;
    private String titulo;
    private String genero;
    private String tipo;
    private String sinopse;
    private String ano;
    private Integer quantidade;
    private String status;
    private Set diretors = new HashSet(0);
    private Set ators = new HashSet(0);
    private Set locacaoMidias = new HashSet(0);

os gets e sets não coloquei não

E

Bom amigo o que está acontecendo exatamente quando você tenta carregar a ComboBox ele ta pegando o ID errado ou simplesmente não carrega a ComboBox? pra min entender melhor.

Bom uma coisa que eu acabei de verificar é que no seu método, você não está passando o ID também, e sim a classe fornecedor.

public boolean inserirMidia(Midia bean) {  
      
           boolean ret = false;  
           try {  
               String sql = ("INSERT INTO midia (titulo, genero, tipo, sinopse, quantidade, status, fornecedor_codigo_FK) "  
                       + "VALUES ( ?,?,?,?,?,?,?,?,?,?,?,? ) ");  
      
               pstmt = conn.prepareStatement(sql);  
               pstmt.setString(1, bean.getTitulo());  
               pstmt.setString(2, bean.getGenero());  
               pstmt.setString(3, bean.getTipo());  
               pstmt.setString(4, bean.getSinopse());  
               pstmt.setInt(5, bean.getQuantidade());  
               pstmt.setString(6, bean.getStatus());  
               pstmt.setObject(7, bean.getFornecedor());  // Nessa parte aqui o certo seria fazer pstmt.setObject(7, bean.getFornecedor().getCodigo_Do_Fornecedor()); pois você estaria passando a classe dai não vai da certo para setar os dados no Banco de Dados mesmo acredito que seja isso, e antes de mandar pro método você tem que setar este item também por exemplo aondé você estiver setando fazer algo assim: veja a outra tag de código.
      
               int rs = pstmt.executeUpdate();  
               if (rs > 0) {  
                   ret = true;  
               }  
           } catch (SQLException e) {  
               System.out.println("Erro ao gravar registro no Banco de Dados:\n" + e.getMessage());  
               ret = false;  
           } finally {  
               //fecha a conexao com o banco  
               conecta.close();  
      
           }  
           return ret;  
       }
Fornecedor fornecedor = new Fornecedor();
       fornecedor.setCodigo_Do_Fornecedor(cdFornecedor); // Aqui você passaria com aquele atributo que pesquisa a ComboBox que eu falei antes para ele pegar o ID, para depois você conseguir pegar seu código e jogar para o CRUD.

É importante você tambem criar os getters e setter para todos os seus modelos como você declarou como private é o certo a se fazer pelas boas práticas da programação, só modificar os atributos com os setter e pegar os valores com os getters, bem mais fácil de trabalhar com os getters e setters.

Criado 16 de abril de 2012
Ultima resposta 19 de abr. de 2012
Respostas 10
Participantes 4