日期:2014-05-18  浏览次数:20750 次

Hibernate + SQLServer开发Blob时的问题
我也是首先看了很多关于Hibernate读写Blob的方法,但是好像很大一部分是关于oracle的。我把他们稍微变了一下变成了自己的写法,不过好像不是很成功。
程序的要求是用户上传一个zip文件(包含8个文件),将其解压并且每个文件单独放在数据库中(程序里是8个Blob变量)。

....
//   in   是zip文件的InputStream

byte[]   buffer   =   new   byte[0];
ZipInputStream   z   =   new   ZipInputStream(in);
ZipEntry   zipEntry;
Momentum   momentum   =   new   Momentum();
Configuration   config   =   new   Configuration().configure();
SessionFactory   sf   =   config.buildSessionFactory();
Session   s   =   sf.openSession();
tx   =   s.beginTransaction();
momentum.setDate(date);
momentum.setSas1(Hibernate.createBlob(buffer));
momentum.setXls1(Hibernate.createBlob(buffer));
momentum.setSas2(Hibernate.createBlob(buffer));
momentum.setXls2(Hibernate.createBlob(buffer));
momentum.setSas3(Hibernate.createBlob(buffer));
momentum.setXls3(Hibernate.createBlob(buffer));
momentum.setSas4(Hibernate.createBlob(buffer));
momentum.setXls4(Hibernate.createBlob(buffer));
s.save(momentum);
s.flush();
s.refresh(momentum,LockMode.UPGRADE);
ZipInputStream   zip   =   new   ZipInputStream(in);
while   ((zipEntry   =   zip.getNextEntry())   !=   null)   {
Blob   blob   =   (SerializableBlob)   momentum.getBlob(zipEntry
.getName());
OutputStream   out   =   blob.setBinaryStream(1);
byte[]   BUFFER   =   new   byte[4096];
int   k   =   1;
long   l   =   0;
while   ((k   =   zip.read(BUFFER,   0,   4096))   >   0)   {
out.write(BUFFER,   0,   k);
l   +=   k;
}
System.out.println(zipEntry.getName()   +   "= "   +   l);
out.close();
}
zip.close();
in.close();
tx.commit();
s.close();

整个程序的意思也就是参考oracle录入blob的步骤,先给blob赋一个空值,然后再往里面写。
程序运行的结果是,每个文件(sas1,xls1-sas4,xls4)都是字节为1的文件,也就是说后半段的update未成功。我不知道是为什么,请问你们知道应该怎么做么?

另外我之所以不用byte[]替换blob作为类Momentum里面文件的类型是因为文件可能比较大(100+MB,但是由于本身是数据库文件所以zip不是很大),所以需要一个buffer一点点写。


------解决方案--------------------
SQLServer 有blob吗?

------解决方案--------------------
不明白~~

幫頂~~~~