persistir blob no postgre  XML
Índice dos Fóruns » Persistência: Hibernate, JPA, JDBC e outros
Autor Mensagem
toncarvalho@gmail.com
JavaBaby

Membro desde: 29/04/2008 09:12:56
Mensagens: 78
Offline

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?


thiagocg
Virtual Machine Man
[Avatar]

Membro desde: 08/04/2006 11:07:07
Mensagens: 541
Localização: Campo Grande - MS
Offline

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

________________________________
Thiago Araujo da Silva
Analista de Sistemas
Tecnólogo em Processamento de Dados (Estácio - CG/MS)
Especialista em Desenvolvimento de Aplicações em Java (Uniderp - CG/MS)
[Email] [MSN]
toncarvalho@gmail.com
JavaBaby

Membro desde: 29/04/2008 09:12:56
Mensagens: 78
Offline

obrigado vou tentar...
alexandremlima
JavaChild
[Avatar]

Membro desde: 29/12/2003 09:01:59
Mensagens: 129
Localização: Salvador-BA
Offline

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).

This message was edited 1 time. Last update was at 25/11/2008 09:24:54

toncarvalho@gmail.com
JavaBaby

Membro desde: 29/04/2008 09:12:56
Mensagens: 78
Offline

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

Membro desde: 29/12/2003 09:01:59
Mensagens: 129
Localização: Salvador-BA
Offline

Entidade:





Tabela no PostgreSQL:




toncarvalho@gmail.com
JavaBaby

Membro desde: 29/04/2008 09:12:56
Mensagens: 78
Offline

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 ?
toncarvalho@gmail.com
JavaBaby

Membro desde: 29/04/2008 09:12:56
Mensagens: 78
Offline

algum exemplo de mapeamento em xml ?
toncarvalho@gmail.com
JavaBaby

Membro desde: 29/04/2008 09:12:56
Mensagens: 78
Offline

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
toncarvalho@gmail.com
JavaBaby

Membro desde: 29/04/2008 09:12:56
Mensagens: 78
Offline

obrigado.. a todos que ajudaram... t+
 
Índice dos Fóruns » Persistência: Hibernate, JPA, JDBC e outros
Ir para:   
Powered by JForum 2.1.8 © JForum Team