Inserção e exibição de uma figura PNG em um banco de dados, utilizando hibernate [resolvido]

4 respostas
carlos_chea
Tudo bem pessoal é o seguinte criei uma classe entidade na minha aplicação para inserção de uma figura PNG com transparência no meu banco de dados, a classe é essa:
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Lob;


@Entity
public class ImagemDeFundo implements Serializable {
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @Lob    
    @Column(name = "imagem", nullable=false)
    private byte[] imagem;
    
    private String nome;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }
    
    public byte[] getImagem() {
        return imagem;
    }

    public void setImagem(byte[] imagem) {
        this.imagem = imagem;
    }
    
}
Acontece que quando eu chamo o Jpa Controller para inserir editar e listar este objeto, o Jpa sempre dá erro de execução ou simplesmente não mostra a figura na ora de listar o objeto... Pra inserir a figura estou fazendo isso:
try {
   ImagemDeFundo i = new ImagemDeFundo();
   ImageIcon imageIcon = new ImageIcon(getFile().getPath());
   Image img = imageIcon.getImage();
   byte[] bytes =  new PngEncoder(img, true).pngEncode();                                 
   i.setImagem(bytes);
   i.setNome("temporario");
   ImagemDeFundoJpaController iJpa = new ImagemDeFundoJpaController();
   iJpa.create(i);
} catch (Exception e) {
   JOptionPane.showMessageDialog(null, "Erro ao inserir a imagem:\n" + e);
}
Para mostrar a figura estou fazendo isso:
ImagemDeFundo i = new ImagemDeFundo();
ImagemDeFundoJpaController iJpa = new ImagemDeFundoJpaController();
i = iJpa.findImagemDeFundo(new Long("1"));
byte[] bytes2 = i.getImagem();
Image imagem = Toolkit.getDefaultToolkit().createImage(bytes2);
ImageIcon img = new ImageIcon(imagem);
JLabel label = new JLabel(img);
jScrollPane1.setViewportView(label);

Por favor, me ajudem!!!!! o que eu estou fazendo de errado pra a figura não aparece quando eu coloco pra mostrar?

Tem algumas pessoas (eu tbm as vezes faço isso ) que simplesmente apontam o caminho no banco de dados, mas agora esta figura tem de ser persistida no bando....

Existe algum outro jeito de inserir e exibir esta figura? Como?

Obs: estou utilizando o Postgres

4 Respostas

J

Coloque o erro que está dando, do stacktrace, pois assim fica muito vago para analisar o caso.

P

Cara, guarda a imagem em um arquivo. Já trabalhamos com essa questão de colocar no banco imagens e só tivemos problemas e colocamos tudo para arquivos em pasta… Se precisar de performace no IO, deixa o caminho dos arquivos em um hash com o id do objeto…

carlos_chea

O erro que da é que eu consigo inserir e atualizar essa imagem no meu banco mais ñ consigo visualizar ela…

é como se a imagem estivesse corrompida…

Javax.persistence.PersistenceException: org.hibernate.exception.GenericJDBCException: could not load an entity: [corretora.ImagemDeFundo#1]

por favor me ajudem!!!

carlos_chea

Pessoal finalmente consegui resolver o meu problema... É o seguinte... Modifiquei a minha classe entidade dessa forma:

import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Lob;


@Entity
public class ImagemDeFundo implements Serializable {
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private Blob image;
    
    private String nome;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }
    
    public Blob getImage() {
        return this.image;
    }

    public void setImage(Blob image) {
        this.image = image;
    }
    
}

O código de inserção ficou assim:

try {
                ImagemDeFundoJpaController iJpa = new ImagemDeFundoJpaController();

                ImagemDeFundo i = new ImagemDeFundo();
                File fileImagem = new File(getFile().getPath());
                FileInputStream fs = new FileInputStream(fileImagem);
                Blob photo = Hibernate.createBlob(fs);
                i.setImage(photo);

                iJpa.create(i);

                JOptionPane.showMessageDialog(null, "A imagem foi inserida");
            } catch (Exception e) {
                JOptionPane.showMessageDialog(null, "erro:\n" + e);
            }

Para mostrar ficou assim:

try {
            ImagemDeFundo i = new ImagemDeFundo();
            ImagemDeFundoJpaController iJpa = new ImagemDeFundoJpaController();

            i = iJpa.pesquisa(new Long("1"));
            
            Blob imgBytes = i.getImage();
            byte[] bin = imgBytes.getBytes(1, (int) imgBytes.length());            
            

            ImageIcon img = new ImageIcon(bin);

        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "erro ao mostrar imagem " + e);
        }

Mas ATENCÃO... pra funcionar a o Jpa Controler de insersao e listagem tem de ser feito dentro de uma transação blz?????
Tipo assim:

public ImagemDeFundo pesquisa(Long id) throws NonexistentEntityException {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();

            try {
                Query q = em.createQuery("from ImagemDeFundo where id=" + id + "");

                return (ImagemDeFundo) q.getSingleResult();
            } catch (EntityNotFoundException enfe) {
                throw new NonexistentEntityException("A imagem de fundo com id " + id + " não existe mais.\n", enfe);
            }
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }
Criado 6 de outubro de 2011
Ultima resposta 8 de out. de 2011
Respostas 4
Participantes 3