Como Pegar Chave Primaria e Inserir na Chave Estrangeira de outra Tabela

Olá amigos do GUJ

Estou tendo problemas na hora de inserir chave primaria da Tabela Compras para chave Estrangeira da Tabela Compras, usando o DAO.

Vou postar Detalhadamente os códigos das TAbelas e a Classe Dao onde esá o código de inserção. O BD é MySQL

Tabelas

CREATE TABLE `cliente` (
  `idcliente` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `nome` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`idcliente`)
) 
CREATE TABLE `compra` (
  `idcompra` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `idcliente` int(10) unsigned NOT NULL,
  `produto` varchar(10) DEFAULT NULL,
  PRIMARY KEY (`idcompra`),
  KEY `compra_FKIndex1` (`idcliente`),
  CONSTRAINT `compra_ibfk_1` FOREIGN KEY (`idcliente`) REFERENCES `cliente` (`idcliente`) ON DELETE NO ACTION ON UPDATE NO ACTION
) 

Classe Logica De Compras

package Logica;

/**
 *
 * @author Douglas
 */
public class CompraBean {

   private int idcompra;
   private int idcliente;
   private String produto;

    public int getIdcliente() {
        return idcliente;
    }

    public void setIdcliente(int idcliente) {
        this.idcliente = idcliente;
    }

   

    public int getIdcompra() {
        return idcompra;
    }

    public void setIdcompra(int idcompra) {
        this.idcompra = idcompra;
    }

    public String getProduto() {
        return produto;
    }

    public void setProduto(String produto) {
        this.produto = produto;
    }
}

Classe DAO de Compras

package CompraDAO;

    import Conexao.ConexaoEstoque;
    import Logica.CompraBean;
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;



    public class CompraDAO {

        public void inserirCompra(CompraBean bean ,int idcliente) throws SQLException{
            int idresult=0;

             Connection con = ConexaoEstoque.getConexao();
            PreparedStatement SQL;
            try{
            SQL = ConexaoEstoque.getConexao().prepareStatement("Select * from cliente where idcliente ='"+idcliente+"'",PreparedStatement.RETURN_GENERATED_KEYS);
            //String sql = "Select * from cliente where nome ='"+idcliente+"'";


               // PreparedStatement ps = con.prepareStatement(null);
                ResultSet rs = SQL.getGeneratedKeys();
                if(rs != null && rs.next()){
                    int lastIsertedId = rs.getInt("idcliente");
                    bean.setIdcliente(lastIsertedId);
                    //bean.setIdcliente(rs.getInt("idcliente"));
                    idresult = bean.getIdcliente();
                }else{
                    System.out.println("Cliente não encontrado");
                }
                rs.close();
                SQL.close();
            }catch(SQLException e){
                System.out.println("Erro de SQL" + e);
            }

            String sql2 = "insert into compra(idcliente,produto) values("+idresult+",?)";
               try {
                PreparedStatement ps2 = con.prepareStatement(sql2);
                ps2.setString(1, bean.getProduto());
                ps2.execute();
                ps2.close();
            } catch (SQLException e) {
                System.out.println("Erro no SQL2" + e);
            }
        }

    }

E no Botão Salvar do Formulário Compras

 private void jBComprarActionPerformed(java.awt.event.ActionEvent evt) {                                         
        CompraBean compraBean = new CompraBean();
        compraBean.setProduto(jTextField3.getText());
        CompraDAO DAO = new CompraDAO();
        try {
            DAO.inserirCompra(compraBean, WIDTH);
        } catch (SQLException ex) {
            JOptionPane.showMessageDialog(null,"Erro ao Salvar" + ex);
        }
    }  

Fiz umas Modificações ae buscando informações na net ma sei lá se é dessa forma…
E não sei se está certo este WIDHT no DAO.inserirCompra, me parece que passa outro parametro aee como int idcliente na Classe DAO…

Quando Salvo alguma Compra ele dá Este Erro:

Conectado ao Banco de Dados
Conectado ao Banco de Dados
Cliente não encontrado
Erro no SQL2com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Cannot add or update a child row: a foreign key constraint fails (estoque.compra, CONSTRAINT compra_ibfk_1 FOREIGN KEY (idcliente) REFERENCES cliente (idcliente) ON DELETE NO ACTION ON UPDATE NO ACTION)

Então Galera procurei tudo que é canto aki na Net e nada

Pelo amor de Deus preciso saber logo faço esta Bendita inserção para mim poder implementar no meu projeto de TCC.

Agradeço à todos que me ajudarem!!!

Você realmente considera isso Java Básico? Procure ler a descrição dos fóruns antes de postar.
Movido para o fórum de persistencia.

Desculpa Viny, não tinha prestado atenção nesta parte…

tá osso eu resolver este problema …

Achei um esquema de fazer um Insert na tabela cliente e depois recuperar esta chave primária…

public void salvarCliente(Estoque cliente) throws Exception {

        PreparedStatement ps = null;
        ResultSet rs = null;


        if (cliente == null) {
            System.out.println("O valor passado não pode ser lido");
        }

        try {

            String sql = "INSERT INTO cliente(nome) VALUES(?)";

            ps = (PreparedStatement) conexao.prepareStatement(sql);
            ps.setString(1, cliente.getNome());

            ps.executeUpdate();
            Statement stmt = conexao.createStatement();
            int UltimoId = -1;
            rs = stmt.executeQuery("SELECT LAST_INSERT_ID() FROM cliente");

            if (rs.next()) {
                UltimoId = rs.getInt(1);
            } else {
                System.out.println("O valor passado não pode ser lido");
            }

            rs.close();
            System.out.println("Key returned from " + "'SELECT LAST_INSERT_ID()': " + UltimoId);
            
        } catch (Exception sqle) {
            System.out.println("Erro ao inserir dados" + sqle);
        } finally {
            try {
                conexao.close();
                ps.close();
            } catch (SQLException ex) {
                System.out.println("Erro ao Fechar Conexão" + ex);
            }
        }
    }

Agora tentando inserir esta chave primaria recuperada na chave estrangeira da tabela compra…

Dá um help aee pessoal…please.

olá amigo, nesta linha DAO.inserirCompra(compraBean, WIDTH); o que vc passa por parametro para o método é o próprio id do cliente? Pq talvez ele não esteja conseguindo pegar nenhum resultado e está tentando inserir uma PK que não tenha…

Isso , seria o id do cliente onde na classe Dao para adicionar Compra passa um parametro do tipo int.

seguinte amigo, vc está tentando inserir um registro na tabela COMPRA com o id do CLIENTE?
só que você está passando por parâmetro justamente o que você está buscando no banco de dados antes de inserir na tabela produto…
não precisa fazer está busca…
bom, fica a dica, dei uma altera na sua classe DAO e funcionou certinho…

package teste;

import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class CompraDAO {

	public void inserirCompra(CompraBean bean, int idcliente) throws SQLException, IOException {

		int idresult = 0;
		Connection con; 
		PreparedStatement SQL;

		try {
			con = ConexaoEstoque.getConexao();
			SQL = con.prepareStatement("Select * from cliente where idcliente = ?");
			SQL.setInt(1, idcliente);
			
			ResultSet rs = SQL.executeQuery();

			if (rs.next()) {
				int lastIsertedId = rs.getInt("idcliente");
				bean.setIdcliente(lastIsertedId);
				idresult = bean.getIdcliente();
			} else {
				System.out.println("Cliente não encontrado");
			}

			rs.close();
			SQL.close();
			con.close();

		} catch (SQLException e) {
			System.out.println("Erro de SQL" + e);
		}

		try {
			con = ConexaoEstoque.getConexao();  
			PreparedStatement ps2 = con.prepareStatement("insert into compra(idcliente, produto) values (?, ?)");
			ps2.setInt(1, idresult);
			ps2.setString(2, bean.getProduto());

			ps2.execute();

			ps2.close();
			con.close();

		} catch (SQLException e) {
			System.out.println("Erro no SQL2" + e);
		}

	}

}

flw

opa, valew JonaTHANNM tentei aki e deu certinho

agora ta tudo blz… …obrigado amigo!!!

blz

só faça o favor de colocar [RESOLVIDO] no tópico.

ok, valew