Persistir blob no postgre

OLá pessoal, estou com problemas pra salvar blob no postgre, pelo que vi na documentação do postgre o tipo pode ser bytea ou oid, mas nunca usei estes campos, na documentação do hibernate encontrei uma solução para um problema semelhante com o banco oracle a solução requer a implementação de uma classe estendendo um tipo do hibernate … mas achei meio complicado…

alguém ai ja passou por este problema como foi a solução?

a um tempo atras passei por um problema desses mas foi bem tranquila a solução, eu precisa gravar a imagem da impressão digital no banco, eu usei na classe byte[] e no bd bytea, cara, tranquilo, grava e le certinho!

Espero ter ajudado!

[ ]'s

obrigado vou tentar…

A solução passa exatamente pelo que o Thiago disse: colocar o atributo na entidade como byte[] e o campo na tabela como bytea ou oid.

Quando você for persistir, excluir ou recuperar a entidade, ela deve estar obrigatoriamente dentro de uma transação (até para recuperar isso é obrigatório).

Ola alexandremlima, vc tem um exemplo de código, do mapeamento no hibernate ?

Entidade:

@Entity
@Table(name = "painel_bordo")
public class PainelBordo implements Serializable {
    @Id
    @Column(name = "id_painel_bordo", nullable = false)
    private Integer id;

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

    // get's e set's
}

Tabela no PostgreSQL:

CREATE TABLE painel_bordo
(
  id_painel_bordo integer NOT NULL,
  bt_mapa oid,
  CONSTRAINT pk_painel_bordo PRIMARY KEY (id_painel_bordo)
) 

Olá legal… funcinou …

so que o sistema em que estou trabalhando ja tem a maioria das entidades mapeadas utilizando xml do hibernate ( arquivos hbm ), não encontrei nada similar na documentação do hibernate para xml…

alguem tem algum funcionando ?

algum exemplo de mapeamento em xml ?

Olá pessoal pra solução ficar legal tive que realmente recorrer a estender uma classe de tipos do hibernate…

dai a solução ficou legal…

vou postar aqui se alguém mais precisar…

/**
*
*/
package com.atual.datamodel.util.tipos;

import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.Serializable;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
import java.util.HashMap;

import org.hibernate.HibernateException;
import org.hibernate.usertype.UserType;
import org.postgresql.largeobject.LargeObject;
import org.postgresql.largeobject.LargeObjectManager;

import com.atual.datamodel.client.usuario.Preferencia;
import com.atual.datamodel.server.usuario.PreferenciaXmlUtil;
import com.atual.datamodel.util.Dozer;

/**

  • DmAtual 24/11/2008 TODO
  • @author developer

*/
public class TipoPreferenciaPostgre implements org.hibernate.usertype.UserType {

public int[] sqlTypes() {
return new int[] { Types.BLOB };
}

public Class returnedClass() {
return HashMap.class;
}

public boolean equals(Object x, Object y) {
return (x == y) || (x != null && y != null && ((Preferencia) x).equals((Preferencia) y));
}

public Object nullSafeGet(ResultSet rs, String[] names, Object preferenciaUsuario) throws HibernateException, SQLException {

Object retorno = null;
LargeObjectManager lobj = ((org.postgresql.PGConnection) rs.getStatement().getConnection()).getLargeObjectAPI();

LargeObject obj = null;
long oid = 0;

if (rs.wasNull()) {
    return new HashMap();
}

oid = rs.getLong(4);
obj = lobj.open(oid, LargeObjectManager.READ);
byte buf[] = new byte[obj.size()];
obj.read(buf, 0, obj.size());

retorno = PreferenciaXmlUtil.xmlToPreferencia(buf);
obj.close();

return retorno;

}

public void nullSafeSet(PreparedStatement st, Object value, int index) throws HibernateException, SQLException {
Preferencia preferencia = (Preferencia) value;

if (preferencia == null) {
    st.setNull(index, Types.BLOB);
} else {
    byte b[] = PreferenciaXmlUtil.preferenciaToXml(preferencia);
    if (b == null)
	st.setNull(index, Types.BLOB);
    else {
	
	LargeObjectManager lobj = ((org.postgresql.PGConnection) st.getConnection()).getLargeObjectAPI();
	
	long oid = lobj.createLO(LargeObjectManager.READ | LargeObjectManager.WRITE);
	
	LargeObject obj = lobj.open(oid, LargeObjectManager.WRITE);
	
	ByteArrayInputStream bais = new ByteArrayInputStream(b);
	int s, tl = 0;
	while ((s = bais.read(b, 0, b.length)) > 0) {
	    obj.write(b, 0, s);
	    tl += s;
	}
	obj.close();
	
	st.setLong(index, oid);
    }
}
}

public Object deepCopy(Object value) {
if (value == null)
    return null;
Preferencia preferencia = (Preferencia) value;
Preferencia preferencia2 = new Preferencia();
Dozer.getMapper().map(preferencia, preferencia2);

return preferencia2;
}

public boolean isMutable() {
return false;
}

/*
 * (non-Javadoc)
 * 
 * @see org.hibernate.usertype.UserType#assemble(java.io.Serializable,
 * java.lang.Object)
 */
public Object assemble(Serializable arg0, Object arg1) throws HibernateException {
// TODO <Ton> Auto-generated method stub
return null;
}

/*
 * (non-Javadoc)
 * 
 * @see org.hibernate.usertype.UserType#disassemble(java.lang.Object)
 */
public Serializable disassemble(Object arg0) throws HibernateException {
// TODO <Ton> Auto-generated method stub
return null;
}

/*
 * (non-Javadoc)
 * 
 * @see org.hibernate.usertype.UserType#hashCode(java.lang.Object)
 */
public int hashCode(Object arg0) throws HibernateException {
// TODO <Ton> Auto-generated method stub
return 0;
}

/*
 * (non-Javadoc)
 * 
 * @see org.hibernate.usertype.UserType#replace(java.lang.Object,
 * java.lang.Object, java.lang.Object)
 */
public Object replace(Object arg0, Object arg1, Object arg2) throws HibernateException {
return arg0;
}

}

no xml ficou

<property name=“preferencia” type=“com.atual.datamodel.util.tipos.TipoPreferenciaPostgre” column=“Xml_pref_pesquisa” />

no banco postgresql o tipo do atributo utilizado foi oid

obrigado… a todos que ajudaram… t+