关于hibernate中保存Blob数据的问题
我在bean和.hbm.xml中用的是java.sql.Blob
以下是我的程序,在//1的地方正常通过,在//2地方抱类型转换错误,java.lang.ClassCastException,
请各位指点,应该怎么改?
import java.io.FileInputStream;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import oracle.sql.BLOB;
import org.hibernate.*;
import org.hibernate.cfg.Configuration;
public void insert()
{
Transaction tran = null;
try
{
tran = session.beginTransaction();
StyleSheetPicture pic = new StyleSheetPicture();
pic.setCmtorderno("JCHI-2000");
pic.setTitle("ht1");
pic.setType(new Integer(1));
pic.setFilename("f1");
pic.setKeyword("k1");
pic.setRawstream(BLOB.empty_lob());
pic.setDescription("d1");
pic.setSourceflag(new Integer(1));
pic.setUpdatedate(strtoSqlDate("2006-06-06"));
pic.setActiveflag(new Integer(1));
session.save(pic);//1
session.flush();
session.refresh(pic,LockMode.UPGRADE);
oracle.sql.BLOB blob = ((oracle.sql.BLOB)pic.getRawstream());//2
OutputStream os = blob.getBinaryOutputStream();
FileInputStream fis = new FileInputStream("C:\\hb1.jpg");
byte[] buf = new byte[10240];
int len = 0;
while((len = fis.read(buf)) > 0)
{
os.write(buf,0,len);
}
fis.close();
os.close();
session.save(pic);
tran.commit();
}
catch (HibernateException e)
{
e.printStackTrace();
if(tran != null)
{
try
{
tran.rollback();
}
catch(HibernateException e1)
{
e1.printStackTrace();
}
}
}
catch (Exception e)
{
e.printStackTrace();
if(tran != null)
{
try
{
tran.rollback();
}
catch(Exception e1)
{
e1.printStackTrace();
}
}
}
finally
{
tran = null;
}
}
你可以跟踪一下程序,看看到//2的位置时,取出的pic.getRawstream()是什么类型
pic.getRawstream()的类型是org.hibernate.lob.SerializableBlob
(oracle.sql.BLOB) 那你用这个转型肯定会ClassCastException
你查一下SerializableBlob的API,看看这个有没有其他的转换方法
oracle.sql.BLOB blob = (org.hibernate.lob.SerializableBlob)pic.getRawstream();//2
OutputStream os = blob.setBinaryStream(long pos);
SerializableBlob的setBinaryStream(long pos) 方法就是返回你所需要的OutputStream
但是这个long参数不知道该传什么,API上没有明确指明
http://www.hibernate.org/hib_docs/v3/api/org/hibernate/lob/SerializableBlob.html#setBinaryStream(long)