Eai pessoal alguem sabe como gravar uma array de byte[] em um campo BLOB no oracle?
Estou implementando um solucao do site do hibernate q é:
1- implementar um userType
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
import java.sql.Blob;
import cirrus.hibernate.Hibernate;
import cirrus.hibernate.HibernateException;
import cirrus.hibernate.UserType;
public class BinaryBlobType implements UserType
{
public int[] sqlTypes()
{
return new int[] { Types.BLOB };
}
public Class returnedClass()
{
return byte[].class;
}
public boolean equals(Object x, Object y)
{
return (x == y)
|| (x != null
&& y != null
&& java.util.Arrays.equals((byte[]) x, (byte[]) y));
}
public Object nullSafeGet(ResultSet rs, String[] names, Object owner)
throws HibernateException, SQLException
{
Blob blob = rs.getBlob(names[0]);
return blob.getBytes(1, (int) blob.length());
}
public void nullSafeSet(PreparedStatement st, Object value, int index)
throws HibernateException, SQLException
{
st.setBlob(index, Hibernate.createBlob((byte[]) value));
}
public Object deepCopy(Object value)
{
if (value == null) return null;
byte[] bytes = (byte[]) value;
byte[] result = new byte[bytes.length];
System.arraycopy(bytes, 0, result, 0, bytes.length);
return result;
}
public boolean isMutable()
{
return true;
}
}
2 - o meu bean ficaria assim:
public class ImageValue
{
private long id;
private image byte[];
public long getId() { return id; }
public void setId(long id) { this.id = id; }
public byte[] getImage() { return image; }
public void setImage(byte[] image) { this.image = image; }
}
e no meu xml(hbm) ficaria assim:
<class name="ImageValue" table="IMAGE_VALUE">
<id name="id/>
<property name="image" column="IMAGE" type="mypackage.BinaryBlobType"/>
</class>
só q usando essa implementação esta me gerando um erro:
java.lang.ClassCastException
oracle.jdbc.driver.OraclePreparedStatement.setBlob(OraclePreparedStatement.java:2094)
org.apache.commons.dbcp.DelegatingPreparedStatement.setBlob(DelegatingPreparedStatement.java:260)
org.apache.commons.dbcp.DelegatingPreparedStatement.setBlob(DelegatingPreparedStatement.java:260)
br.gov.dpf.mpgo.util.BinaryBlobType.nullSafeSet(BinaryBlobType.java:159)
net.sf.hibernate.type.CustomType.nullSafeSet(CustomType.java:118)
net.sf.hibernate.persister.EntityPersister.dehydrate(EntityPersister.java:394)
net.sf.hibernate.persister.EntityPersister.insert(EntityPersister.java:512)
net.sf.hibernate.persister.EntityPersister.insert(EntityPersister.java:489)
net.sf.hibernate.impl.ScheduledInsertion.execute(ScheduledInsertion.java:28)
net.sf.hibernate.impl.SessionImpl.executeAll(SessionImpl.java:2306)
net.sf.hibernate.impl.SessionImpl.execute(SessionImpl.java:2259)
net.sf.hibernate.impl.SessionImpl.flush(SessionImpl.java:2185)
net.sf.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:61)
br.gov.dpf.mpgo.dao.hibernate.HibernateDAOFactory.transactionCommit(HibernateDAOFactory.java:128)
br.gov.dpf.mpgo.dao.hibernate.DAOHibernateAbstract.insert(DAOHibernateAbstract.java:30)
br.gov.dpf.mpgo.action.ActionCadastroImagem.gravarImagem(ActionCadastroImagem.java:47)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
java.lang.reflect.Method.invoke(Method.java:324)
org.apache.struts.actions.DispatchAction.dispatchMethod(DispatchAction.java:280)
org.apache.struts.actions.DispatchAction.execute(DispatchAction.java:216)
org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:484)
org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:274)
org.apache.struts.action.ActionServlet.process(ActionServlet.java:1482)
org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:525)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
javax.servlet.http.HttpServlet.service(HttpServlet.java:810)
tb fiz uma modificacao no objeto BinaryBlobType no metodo nullSafeSet:
public void nullSafeSet(PreparedStatement st, Object value, int index)
throws HibernateException, SQLException
{
st.setBytes(index, (byte[]) value);
}
com isso eu consigo gravar uma array de byte[] pequena na ordem de 4kb
ja tentei um monte de coisa e nada.
alguem ja passou por isso ou tem alguma ideia de implementacao?