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