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

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:

[code]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;
}

}[/code]

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

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

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…

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

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

[code]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;
}

}[/code]

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