Problema ao setar codigo na foreign key

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.

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!

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

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;
    }

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

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

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

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

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.

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

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.