Salvar imagem no Banco (hibernate + postgress) salva só 6 caracteres

Srs. Bom dia,

Estou encontrando uma dificuldade enorme em salvar imagens no meu banco de dados, estou usando - Netbeans 6.8 + Hibernate + Postgress, segue abaixo o código que estou usando, ocorre que quando consulto o banco os dados cadastrados não passam de 6 ou 7 caracteres.

Peço por gentileza caso possam ajudar, já perdi um bom tempo nisso patinando nisso e não saio do lugar.

------ trecho da minha classe -------

[code]

private void gravaEmpresa() throws FileNotFoundException{
    if (listEmpresas.size() == 0){
           
        try {
            //Chama o método pra adicionar todos os dados padrões no sistema,
            //já que é a primeira entrada do sistema.
            carrega();
            //Cria uma empresa padrão
            empresas = new Empresa();
            empresas.setId(Long.parseLong("1"));
            empresas.setNomeFantasia("SIGSESMT");
            
            
            
            //Ler a imagem do caminho especificado
            logomarca = ImageIO.read(new File("C:/1.jpg"));
            //OBTEM A IMAGEM E TRANSFORMA EM BYTES[]
            ByteArrayOutputStream bytesImg = new ByteArrayOutputStream();
            ImageIO.write((BufferedImage) logomarca, "jpg", bytesImg); //seta a imagem para bytesImg

            bytesImg.flush(); //limpa a variável
            byte[] byteArray = bytesImg.toByteArray(); //Converte ByteArrayOutputStream para byte[]
            bytesImg.close(); //fecha a conversão

           empresas.setLogomarca(byteArray); //erro no banco ... ou no DAO
            
           empresaDAO.saveOrUpdate(empresas);

            //Cria Outros atributos padrões
            JOptionPane.showMessageDialog(this, "Entre em cadastros para cadastrar sua empresa!", "Bem Vindo", JOptionPane.PLAIN_MESSAGE);
        } catch (IOException ex) {
            Logger.getLogger(FormLogin.class.getName()).log(Level.SEVERE, null, ex);
        }

    } else{
        setVisible(true);
        usuarios = null;
    }
}[/code]

-------------meu DAO------------


package dao;

import entidades.Empresa;
import java.util.List;
import javax.persistence.Query;
import javax.persistence.EntityManager;
import util.Banco;

public class EmpresaDAO {

    //Cria um novo objeto de entidade.
    EntityManager em;

    //Cria um objeto para fazer as consultas.
    Query q;

    //Construtor da classe que já instacia os objetos para acesso ao banco.
    public EmpresaDAO() {

        //Objeto de entidade recebe um objeto de entidade real do banco, através da classe Banco.
        em = Banco.getInsatance().getEntityManager();

        //Cria um objeto para manipular as consultas no banco.
        q=em.createQuery("FROM Empresa forn order by forn.nomeFantasia");
    }

    //Método que faz consulta ao banco de dados através do ID passado como parâmetro.
    public Empresa get(Long id){
        em.clear();
        em.getTransaction().begin();
        Empresa forn =em.find(Empresa.class,id);
        em.getTransaction().commit();
        return forn;
        
    }

    //Cria uma consulta de Empresa, e retorna em uma lista de Empresas.
    public List<Empresa> select(){
        em.clear();
        em.getTransaction().begin();
        
        List lista=em.createQuery("FROM Empresa forn order by forn.nomeFantasia").getResultList();
        
        em.getTransaction().commit();
        return lista;
    }
    //Busca de Fornecedores, passando uma lista de fornecedores, e um filtro passado como parâmetro.
    public List<Empresa> select(String filtro){
        em.clear();
        em.getTransaction().begin();
        
        String hsql;
        hsql = "FROM Empresa forn ";
        hsql += "Where ";
        hsql += "forn.nomeFantasia like :filtro ";
        hsql += "OR forn.endereco like :filtro ";
        
        Query query = em.createQuery(hsql);
        query.setParameter("filtro", filtro + "%");
        
        List lista=query.getResultList();
        
        em.getTransaction().commit();
        return lista;
    }

    //Método para salvar Empresa. Passa um objeto Empresa como parâmetro.
    public void saveOrUpdate(Empresa forn){
        em.clear();
        em.getTransaction().begin();
        em.merge(forn);
        em.getTransaction().commit();
    }

    //Método para deletar Empresa. Passa um objeto Empresa como parâmetro.
    public void delete(Empresa forn ){
        em.clear();
        em.getTransaction().begin();
        forn = em.find(Empresa.class,forn.getId());
        if (forn!=null){
            em.remove(forn);
        }
        em.getTransaction().commit();
    }

    public Empresa select(int varlogoempresa) {
        em.clear();
        em.getTransaction().begin();
        Empresa forn =em.find(Empresa.class,varlogoempresa);
        em.getTransaction().commit();
        return forn;
    }
    
}

-----------Minha entidade-----------

*subtrai os outros get/set para ficar mais limpo



package entidades;

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.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.Lob;
import javax.persistence.ManyToOne;
import javax.persistence.OneToOne;


@Entity
@Inheritance(strategy=InheritanceType.JOINED)
public class Empresa implements Serializable {
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Long id;
    private String nomeFantasia;

      @Lob
    @Column(name = "logomarca")
    private byte[] logomarca;

    public Empresa() {
    }


    public Logomarca getLogomarca () {
        return logomarca;
    }

    public void setLogomarca (Logomarca logomarca) {
        this.logomarca= logomarca;
    }

//tambem usei
/*
public byte[] getLogomarca () {
        return logomarca;
    }

    public void setLogomarca (byte[] logomarca) {
        this.logomarca= logomarca;
    }*/
 
    
    public String getNomeFantasia() {
        return nomeFantasia;
    }

    public void setNomeFantasia(String nomeFantasia) {
        this.nomeFantasia = nomeFantasia;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

     /**
     * Retorna um valor de codigo hash para o objeto.  Esta implementcao computa
     * um valor de c�digo hash baseado nos campos id deste objeto.
     * @return um valor de c�digo hash para este objeto.
     */
    @Override
    public int hashCode() {
        int hash = 0;
        hash += (this.id != null ? this.id.hashCode() : 0);
        return hash;
    }  
    
    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Empresa)) {
            return false;
        }
        Empresa other = (Empresa)object;
        if (this.id != other.id && (this.id == null || !this.id.equals(other.id))) return false;
        return true;
    }
    
    
    /**
     * Retorna uma representa��o literal deste objeto.  Esta implementa��o cria
     * uma representa��o baseada nos campos id.
     * @return uma representa��o literal deste objeto.
     */
    @Override
    public String toString() {
        //return "classes.Empresa[id=" + id + "]";
        return nomeFantasia;
    }

}

esse codigo ae compila? visto que vc esta setando um array de bytes no seu objeto empresa que espera um Logomarca?

arrumei o codigo da entidade para

    public byte[] getLogomarca() {
        return this.logomarca;
    }

    public void setLogomarca(byte[] logomarca) {
        this.logomarca = logomarca;
    }

A classe está 100% (compilando)
só que o banco recebe e grava só uns 8 caracteres… somente numeros…

tentei iserir diretamente no bonco e não estou conseguindo… porem na compilação não dá nenhum erro…será que é isso? no post o hibernate cria o campo como OLD.

Nihuem para ajudar um entusiasta?

Acho que provavelmente, é seu campo no PostgreSQL.

Sei q no MySQL, pra salvar 6mb, se não me engano, tem que ser MediumBlob ao invés de um Blob. Procura na documentação do PostgreSQL qual campo você deve usar.

Olá amigo tudo bem,

se não estou engano isso aconteceu comigo também.
Vc deve criar no BD uma coluno chamada TEXT ela suporta um grande quantidade de dados. Outra coisa, para ficar mais fácil sua aprendizagem, vc deve fazer alguns testes:
1- tente ler uma imagem e jogar para um tela
2 - Pegue sua imagem e grave em um diretorio de sua maquina

assim fica mais fácil de testar qualquer duvida posta os erros.

Outra coisa, se não estou engando esse problema é por conta de sua má conversão para bits, esses dados que estão sendo gravados são numeros hexadecimais algo do tipo: F345A2 correto… qualquer coisa me informe.

att

Olá. o código abaixo mostra que vc está passando um id para um tipo IDENTITY…

//Cria uma empresa padrão  
empresas = new Empresa();  
empresas.setId(Long.parseLong("1")); 
@Id  
@GeneratedValue(strategy=GenerationType.IDENTITY)  
private Long id;

Verifica isso e caso não dê certo… manda o log que é gerado…

Antes de mais nada muito obrigado.

Bom o problema persiste…

Jayro, boa noite
Acredito que não seja isso pois ele grava tranquilo e não dá pau nenhum, meu problema é que ele grava apenas seis numeros inteiros…

Hvivox, boa noite
Fiz os passos 1 e 2 dois e sem problema…

a imagem é pequena (um jpg de 7x7cm)

criei dois campos para salvar:
um oid onde os caracteres gravados são … 327954
outro bytea onde aparece <campo binario>
ambos os casos não carregam quando chamo no Jlabel

continuo batendo cabeça…