我也是首先看了很多关于Hibernate读写Blob的方法,但是好像很大一部分是关于oracle的。我把他们稍微变了一下变成了自己的写法,不过好像不是很成功。
程序的要求是用户上传一个zip文件(包含8个文件),将其解压并且每个文件单独放在数据库中(程序里是8个Blob变量)。....
// in 是zip文件的InputStreambyte[] 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一点点写。