Problema na Utilização do Método alterarProduto no Banco Mysql

Opa pessoal boa noite, sou iniciante em java porém adorei o java já de inicio, o meu problema é tenho esse método no repositórioProduto que é uma implementação de uma interface IRepositorioProduto: Pelo o que eu acho não tenho certeza aqui está tudo certo.

// Metodo alterar Produto que usa como Argumento do Parametro um Objeto Produto
    @Override
    public void alterar(Produto p) throws RepositorioException, ConexaoException {
         Connection c = g.conectar(); //solicitação de uma conexão
         String sqlAlterar = "UPDATE produto SET nome_produto=?,preco=?,qtd_estoque=?,fornecedor_codigo_fornecedor=?,tipo_produto_codigo_tipo_produto=? WHERE codigo_produto=?"; //script SQL
       try  { 
           PreparedStatement pstm = c.prepareStatement(sqlAlterar);
           pstm.setString(1,p.getNomeProduto()); //Retorna o nome do produto a ser modificado
           pstm.setDouble(2,p.getPreco());       // Retorna o preço do produto a ser modificado
           pstm.setInt(3,p.getQtdEstoque());    //Retorna a quantidade d o produto a ser modificada
           pstm.setInt(4,p.getCodigoFornecedor()); // Retorna o codigo do fornecedor do produto
           pstm.setInt(5,p.getCodigoTipoProduto()); //retorna o codigo do tipo de Produto
           pstm.setInt(6,p.getCodigoProduto()); // retorna om codigo do produto a ser alterado
           pstm.executeUpdate();                // faz as atualização requeridas no comando SQL
           pstm.close();                        // libera o PreparedStatement
         }catch(SQLException ex){
             throw new RepositorioException(ex.getMessage());
         }
       finally{
           g.desconectar(c); // libera a conexão com o banco de dados
       }
    }//fim dometodo alterar com parametro um objeto Produto

Na camada de negocio tento tratar algumas exceções :

 public void alterar (Produto p)throws RepositorioException, ConexaoException, GeralException {
        // validação dos campos da classe Produto neste método
        
        if((p.getNomeProduto()==null) || (p.getNomeProduto().equals("")))
            throw new GeralException("Nome do Produto Inválido");
                
        if(p.getPreco()<0)
            throw new GeralException("Preço do Produto Inválido");
       
        if(p.getQtdEstoque()<0)
             throw new GeralException("Quantidade de Produto Inválida");
        
        if(p.getCodigoProduto()<1){
            throw new GeralException("Codigo do Produto Invalido");
        }
       try{
           rep.alterar(p);
       }catch(RepositorioException e){
            throw new GeralException("  Repositório com Problema");
       }catch(ConexaoException e){
            throw new GeralException("O Banco de Dados Esta com Problemas de Conexão");
        }
    }// fim do metodo alterar produto usando um objeto de Produto

Meu Problema inicia de fato aqui, quando tenho que utilizar a fachada não sei bem como criar o método alterarProduto na fachada fiz isso:

public void alterarProduto(int codigoProduto,Produto p )throws GeralException, RepositorioException, ConexaoException{
             
      //Consultar
       p = negocioProduto.consultar(codigoProduto);
       
       //Alterar
       negocioProduto.alterar(p);
  }

No main quando tento rodar um teste cai no excepion " Repositório com Problema" porém não encontro o defeito no repositório o main está assim:


public class Main {
    // instância de um objeto fachada
    private static Fachada fachada = new Fachada();
    
    
    // Metodo principal que se encarregará de roda a aplicação
    public static void main(String [] args){
        // teste dos metodos de salvar,consultar,excluir e listar Produto.
        
          //testeSalvarProduto();
          //testeExcluirProduto();
         // testeConsultarProduto();
         //testeListarProduto();
        testeAlterarProduto();
    }


private static void testeAlterarProduto() {
        System.out.println("Inicio Teste Alterar");
        Produto p;       
        try{            
            fachada.alterarProduto(1,p = new Produto("Diablo 3",99.9,30,1,1 ));
        }catch(GeralException e){
             JOptionPane.showMessageDialog(null, e.getMessage());
        }catch(ConexaoException e){
            JOptionPane.showMessageDialog(null, "Conexão bugada");
        }catch(RepositorioException e){
             JOptionPane.showMessageDialog(null, "Repositorio Com defeito");
        }
         System.out.println("Fim Alterar Produto");
    }
}

Sei que aparti da camada de negocio fiquei perdido, queria a juda de vocês para poder sanar esse problema.

Abraços.

Faz o seguinte… no primeiro trecho de código que você postou, aquele método alterar(), altere este pedaço:

 }catch(SQLException ex){  
              throw new RepositorioException(ex.getMessage());  
          }  

para

 }catch(SQLException ex){  
              ex.printStackTrace();
              throw new RepositorioException(ex.getMessage());  
          }  

Recompile a classe e execute pela linha de comando. Se o resultado não for claro pra você, poste aí o que retornou

deu esse erro amigo:

[code]

Inicio Teste Alterar
com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Cannot add or update a child row: a foreign key constraint fails (livraria_poo.produto, CONSTRAINT fk_produto_fornecedor1 FOREIGN KEY (fornecedor_codigo_fornecedor) REFERENCES fornecedor (codigo_fornecedor) ON DELETE NO ACTION ON UPDATE NO ACTION)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:525)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:409)
at com.mysql.jdbc.Util.getInstance(Util.java:384)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1041)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3566)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3498)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1959)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2113)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2568)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2113)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2409)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2327)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2312)
at Projeto2012_POO.repositorio.RepositorioProduto.alterar(RepositorioProduto.java:104)
at Projeto2012_POO.negocio.NegocioProduto.alterar(NegocioProduto.java:94)
at Projeto2012_POO.fachada.Fachada.alterarProduto(Fachada.java:94)
at Projeto2012_POO.main.Main.testeAlterarProduto(Main.java:87)
at Projeto2012_POO.main.Main.main(Main.java:30)[/code]

Certo, agora temos pistas mais certeiras.
O que acontece aí: você está tentando atualizar um registro da tabela “produto” passando para ele um código de fornecedor que não existe na sua tabela "fornecedor"
Eu arriscaria dizer que sua tabela fornecedor não tem nenhum registro com código de fornecedor igual a 1

Isso é estranho pois tinha a mesma certeza que era esse o erro porém amigo, tenho fornecedor e tipo_produto no banco, aliás tenho apenas um registro de fornecedor e tipo_produto eles estao com suas PKs 1, acabei de dropar o banco e importa-lo novamente.

erro está muito estranho mesmo.

Não sei mais o que fazer. :frowning:

Alguém mais?

opa, desculpa, acredito que quando criou a tabela não colocou:

ON UPDATE CASCADE

verifica lá onde você tá pegando os valores dos atributos do objeto produto e passando pro PreparedStatement. Dá System.out.println() em cada um deles

Ok amigo farei o que vocês estão pedindo e assim que fizer darei um retorno a vocês, muito obrigado pela ajuda de vocês 2, ADEMILTON e aix.

Apa amigos consegui resolver o problema valeu pela ajuda de todos, na verdade o que houve foi um erro nesse trecho de codigo:



public void alterarProduto(int codigoProduto,Produto p )throws GeralException, RepositorioException, ConexaoException{  
               
      //Consultar  
       p = negocioProduto.consultar(codigoProduto);  
         
       //Alterar  
       negocioProduto.alterar(p);  
  }  

O meu Professor me ajudou a encontrar o erro :slight_smile: na verdade neste método na fachada eu dava um inteiro como Pk do objeto p do tipo Produto e armazenada em outro objeto p do tipo produto, resumindo o que era consultado passava para o mesmo objeto e alterava afffff tosqueira. abraços a todos e aqui está resolvido.