[RESOLVIDO] Como Editar dados de um Registro que contém Imagem, mas sem alterar o dado Imagem - Mysql, Java, Hibernate

Boa tarde. Sou novo no fórum, aliás, nunca mexi em fórum, portanto nem sei como utilizar direito.

Se eu estiver repetindo a pergunta, me desculpem, mas procurei e não achei resposta pra minha dúvida nem aqui e nem em lugar nenhum na internet.

Então vamos a dúvida:

Criei um projeto Java para Desktop onde eu manipulo dados dos filmes que tenho no HD Externo, usando Hibernate e Mysql.

Dados como: Nome, Ano de Lançamento, Sinopse … e a Capa, portanto uma imagem, no caso em jpg.

Nesta aplicação, eu Cadastro(Tela(JFrame) à parte), Edito(Tela(JFrame) à parte), Deleto, Mostro na Tabela(Tela(JFrame) à parte), e mostro numa tela a parte também, chamada Sinopse, apenas o Nome, a Sinopse e a Capa.

A Capa do Filme, eu mostro num JLabel, em todas as telas, Cadastrar, Editar e Sinopse, usando o JFileChooser.

Tudo funciona normal, menos na parte de Editar, quando por exemplo, eu vou alterar só o Nome do Filme, então ou seja, não mudei a imagem, ai ao clicar em salvar para efetivar o update, a aplicação não salva, da uma Exceção, a famosa NullPointerException, pois não encontra o Path, ou seja, o endereço da imagem. Quando eu mudo a imagem, ai encontra o endereço e salva certinho.

Vou postar abaixo alguns códigos para ver se vocês conseguem me ajudar.

  • Função Editar - que fica no menu da minha tela Principal:

private void itemEditarActionPerformed(java.awt.event.ActionEvent evt) {

    // ITEM EDITAR
    
    // verificar se algum filme foi selecionado ou não na tabela
    // se foi, a tela de edição será apresentada
    if( jTable1.getSelectedRow( ) != -1 ) {
    
        int linhaSelecionada = jTable1.getSelectedRow( );
    
        String cod = jTable1.getValueAt( linhaSelecionada, 0 ).toString( );
        String nome = jTable1.getValueAt( linhaSelecionada, 1 ).toString( );
        String lancamento = jTable1.getValueAt( linhaSelecionada, 2 ).toString( );
        String genero = jTable1.getValueAt( linhaSelecionada, 3 ).toString( );
        String duracao = jTable1.getValueAt( linhaSelecionada, 4 ).toString( );
        String nota_imdb = jTable1.getValueAt( linhaSelecionada, 5 ).toString( );
        String qualidade = jTable1.getValueAt( linhaSelecionada, 6 ).toString( );
        String resolucao = jTable1.getValueAt(linhaSelecionada, 7 ).toString( );
        String formato = jTable1.getValueAt( linhaSelecionada, 8 ).toString( );
        String tamanho = jTable1.getValueAt( linhaSelecionada, 9 ).toString( );
        String sinopse = jTable1.getValueAt( linhaSelecionada, 10 ).toString( );
        
        List<Filme> listaDeFilmes = metodos.ListarFilmes( );
        
        byte[] capa = listaDeFilmes.get(linhaSelecionada).getCapa( );
                    
        try {
            
            // redirecionar
            new Tela_Editar( this, true, cod, nome, lancamento, genero, duracao, nota_imdb, qualidade, resolucao, formato, tamanho, sinopse, capa ).setVisible(true);
            
        } 
        
        catch ( ParseException ex ) {
            
            Logger.getLogger( Tela_Principal.class.getName( ) ).log( Level.SEVERE, null, ex );
            
        }
        
        // apaga a seleção feita na tabela
        jTable1.clearSelection( );
        
        // atualizar tabela
        MostrarFilmesNaTabela( );
    
    }        
    
    else {
        
        // informação
        JOptionPane.showMessageDialog( null, "Primeiro selecione um filme na tabela !" );
        
    }       
    
}
  • Botão Salvar da minha tela Editar:

private void botaoSalvarActionPerformed(java.awt.event.ActionEvent evt) {

    // BOTÃO SALVAR
    
    if( campoNome.getText( ).equals( "" ) || campoLancamento.getText( ).trim( ).length( ) != 4 || ( campoGenero.getSelectedItem( ) == null ) || campoDuracao.getText( ).trim( ).replace( " ", "" ).length( ) != 7 || campoNota.getText( ).trim( ).length( ) != 3 || ( campoQualidade.getSelectedItem( ) == null ) || campoResolucao.getText( ).trim( ).length( ) != 9 || ( campoFormato.getSelectedItem( ) == null ) || campoTamanho.getText( ).trim( ).replace( " ", "" ).length( ) != 6 || campoSinopse.getText( ).equals( "" ) || labelCapa.getIcon( ) == null ) {
        
        // informação
        informacaoEditar.setForeground( Color.RED ); // cor do texto do jLabel quando aparecer a mensagem abaixo
        informacaoEditar.setText( "| Preencha todos os campos  ! |" );
        
    }
    
    else {
        
        if( enderecoDaCapa != null ) {
        
        Filme filme = new Filme( );
    
        filme.setCod( Integer.parseInt( cod ) );
        filme.setNome( campoNome.getText( ) );
        filme.setLancamento( Integer.parseInt( campoLancamento.getText( ) ) );
    
        Genero genero = new Genero( );
        genero.setGenero( campoGenero.getSelectedItem( ).toString( ) );
    
        filme.setGenero( genero );
        filme.setDuracao( campoDuracao.getText( ) );
        filme.setNota_imdb( campoNota.getText( ) );
    
        Qualidade qualidade = new Qualidade( );
        qualidade.setQualidade( campoQualidade.getSelectedItem( ).toString( ) );
    
        filme.setQualidade( qualidade );
        filme.setResolucao( campoResolucao.getText( ) );
    
        Formato formato = new Formato( );
        formato.setFormato( campoFormato.getSelectedItem( ).toString( ) );
    
        filme.setFormato( formato );
        filme.setTamanho( campoTamanho.getText( ) );
        filme.setSinopse( campoSinopse.getText( ) );
                    
        try {
            
            File f = new File(enderecoDaCapa);
            
            FileInputStream fis;
        
            fis = new FileInputStream(f);            
            
            ByteArrayOutputStream baos = new ByteArrayOutputStream( );
            
            byte[] novoArray = new byte[1024];
            
            for( int ler; ( ler = fis.read(novoArray) ) != -1; ) {
                
                baos.write( novoArray, 0, ler );
                
            }
            
            arrayDeBytes = baos.toByteArray( );
            
            filme.setCapa(arrayDeBytes);
            
        } catch ( FileNotFoundException ex ) {
            
            Logger.getLogger(Tela_Cadastrar.class.getName()).log(Level.SEVERE, null, ex);
            
        } catch ( IOException ex ) {
            
            Logger.getLogger(Tela_Cadastrar.class.getName()).log(Level.SEVERE, null, ex);
            
        }
    
        Metodos metodos = new Metodos( );
    
        // executar metodo editar
        metodos.Editar(filme);
        
        // informação
        informacaoEditar.setForeground( new Color( 34, 139, 34 ) ); // cor do texto do jLabel quando aparecer a mensagem abaixo
        informacaoEditar.setText( "| Filme editado com sucesso  ! |" );
        
        } else {
            
            System.out.println(enderecoDaCapa);
            
        }
                                
    }
    
}
  • Ao clicar no JLabel da Tela Editar:

private void labelCapaMouseClicked(java.awt.event.MouseEvent evt) {

    // JLABEL PARA SELECIONAR CAPA
    
    JFileChooser janelaParaSelecionarCapa = new JFileChooser( );
    
    janelaParaSelecionarCapa.setFileFilter( new FileNameExtensionFilter( "Imagens em JPEG e PNG", "png", "jpg", "jpeg" ) );
    janelaParaSelecionarCapa.setAcceptAllFileFilterUsed(false);
    janelaParaSelecionarCapa.setDialogTitle( "Selecione uma Capa:" );
    janelaParaSelecionarCapa.showOpenDialog(this);
    
    if( janelaParaSelecionarCapa.getSelectedFile( ) != null ) {
    
        File f = janelaParaSelecionarCapa.getSelectedFile( );
    
        enderecoDaCapa = f.getAbsolutePath( );
    
        ImageIcon icone = new ImageIcon( new ImageIcon(enderecoDaCapa).getImage( ).getScaledInstance( 171, 252, 0 ) );
    
        labelCapa.setIcon(icone);
    
    }
    
}
  • Método Editar, em Hibernate, da minha classe de métodos:

public void Editar( Object o ) {

    sessao = HibernateUtil.getSessionFactory( ).openSession( );
    sessao.beginTransaction( ).begin( );
    sessao.update(o);
    sessao.getTransaction( ).commit( );
    sessao.close( );        
    
} 

Enfim, é isso, espero que alguém possa me ajudar. É um projeto que fiz em 2013, ai esse ano decidi finalizá-lo implementando essa nova função da Capa do Filme.

Agradeço desde já a ajuda.

Já tentou obter o objeto antes de salvar, setar apenas os valores onde quer alterar e dá um save?

Já tentei fazer filme.setCapa(labelCapa.getText().getBytes()) no salvar, na tela de edição, e não funciona. O problema é o endereço da imagem, o path, ou seja, preciso transformar um array de bytes em por exemplo: C:/imagem.jpg, senão o endereço vai continuar dando null ao tentar editar sem trocar a imagem. Se troco a imagem, pode ser para a mesma, já funciona. Mas ai não faz sentido eu tê-la no banco de dados, se toda vez que eu quiser editar algum dado que não seja a imagem, eu tiver que buscar pela mesma no C: por exemplo.

Pessoal, consegui resolver !

As vezes a gente passa por cima e não enxerga a solução e por eu estar enferrujado no Java também, ai complica mais ainda.

A solução é a seguinte:

Criei um novo Array de Bytes chamado capaAtual. Dentro do construtor da minha Tela_Editar eu coloquei this.capaAtual = capa, ou seja, o valor do parâmetro capa que recebo no construtor, é atribuido a nova variável capaAtual. E na ação do botão Salvar a edição, eu adicionei um if else, onde quando o enderecoDaCapa for igual a null, ai eu coloco: filme.setCapa(capaAtual). Pronto.

Veja o código do botão Salvar edição:

// BOTÃO SALVAR

    if( campoNome.getText( ).equals( "" ) || campoLancamento.getText( ).trim( ).length( ) != 4 || ( campoGenero.getSelectedItem( ) == null ) || campoDuracao.getText( ).trim( ).replace( " ", "" ).length( ) != 7 || campoNota.getText( ).trim( ).length( ) != 3 || ( campoQualidade.getSelectedItem( ) == null ) || campoResolucao.getText( ).trim( ).length( ) != 9 || ( campoFormato.getSelectedItem( ) == null ) || campoTamanho.getText( ).trim( ).replace( " ", "" ).length( ) != 6 || campoSinopse.getText( ).equals( "" ) || labelCapa.getIcon( ) == null ) {
        
        // informação
        informacaoEditar.setForeground( Color.RED ); // cor do texto do jLabel quando aparecer a mensagem abaixo
        informacaoEditar.setText( "| Preencha todos os campos  ! |" );
        
    }
    
    else {
        
        Filme filme = new Filme( );
    
        filme.setCod( Integer.parseInt( cod ) );
        filme.setNome( campoNome.getText( ) );
        filme.setLancamento( Integer.parseInt( campoLancamento.getText( ) ) );
    
        Genero genero = new Genero( );
        genero.setGenero( campoGenero.getSelectedItem( ).toString( ) );
    
        filme.setGenero( genero );
        filme.setDuracao( campoDuracao.getText( ) );
        filme.setNota_imdb( campoNota.getText( ) );
    
        Qualidade qualidade = new Qualidade( );
        qualidade.setQualidade( campoQualidade.getSelectedItem( ).toString( ) );
    
        filme.setQualidade( qualidade );
        filme.setResolucao( campoResolucao.getText( ) );
    
        Formato formato = new Formato( );
        formato.setFormato( campoFormato.getSelectedItem( ).toString( ) );
    
        filme.setFormato( formato );
        filme.setTamanho( campoTamanho.getText( ) );
        filme.setSinopse( campoSinopse.getText( ) );
        
        if( enderecoDaCapa != null ) {
                               
            try {
            
                File f = new File(enderecoDaCapa);
            
                FileInputStream fis;
        
                fis = new FileInputStream(f);            
            
                ByteArrayOutputStream baos = new ByteArrayOutputStream( );
            
                byte[] novoArray = new byte[1024];
            
                for( int ler; ( ler = fis.read(novoArray) ) != -1; ) {
                
                    baos.write( novoArray, 0, ler );
                
                }
            
                arrayDeBytes = baos.toByteArray( );
            
                filme.setCapa(arrayDeBytes);
            
            } catch ( FileNotFoundException ex ) {
            
                Logger.getLogger(Tela_Cadastrar.class.getName()).log(Level.SEVERE, null, ex);
            
            } catch ( IOException ex ) {
            
                Logger.getLogger(Tela_Cadastrar.class.getName()).log(Level.SEVERE, null, ex);
            
            }        
        
        } else {
            
            // aqui vai salvar a capa atual
            // pega o valor do atributo capa, que foi recebido via parâmetro no contrutor da Tela_Editar
            filme.setCapa( capaAtual );
            
        }
        
        Metodos metodos = new Metodos( );
        
        // executar metodo editar
        metodos.Editar(filme);
        
        // informação
        informacaoEditar.setForeground( new Color( 34, 139, 34 ) ); // cor do texto do jLabel quando aparecer a mensagem abaixo
        informacaoEditar.setText( "| Filme editado com sucesso  ! |" );
                                
    }

Valeu Diego_Emmanuell por tentar me ajudar.

Um abraço a todos.