用hibernate操作oracle的blob字段

 

 

 

1. Bolb类型字段说明: 
写入Blob字段和写入其它类型字段的方式非常不同,因为Blob自身有一个cursor,你必须使用cursor对blob进行操作,因而你在写入Blob之前,必须获得cursor才能进行写入,那么如何获得Blob的cursor呢?

这需要你先插入一个empty的blob,这将创建一个blob的cursor,然后你再把这个empty的blob的cursor用select查询出来,这样通过两步操作,你就获得了blob的cursor,可以真正的写入blob数据了。

2. 获取游标存在的问题:
因为我使用的是weblogic配置的数据源,weblogic做了一些封装,返回来的blob的是weblogic.jdbc.wrapper.Blob对象,不能直接转化为oracle的JDBC的oracleBlob,否则产生转型异常 Cast Exception
 
代码示例:


//PO:CardSuitInfo
public class CardSuitInfo implements Serializable {

private java.sql.Blob cardFacePicFile;

public void setCardFacePicFile(Blob cardFacePicFile) {
        
this.cardFacePicFile = cardFacePicFile;
}


public java.sql.Blob getCardFacePicFile() {
        
return this.cardFacePicFile;
}

}


//1.首先插入空的blob
cardSuitInfo.setCardFacePicFile(net.sf.hibernate.Hibernate.createBlob(new byte[1]));
session.save(cardSuitInfo);
session.flush();
//2.写入blob
session.refresh(cardSuitInfo, LockMode.UPGRADE);// 设置锁定级别
weblogic.jdbc.wrapper.Blob weblogicBlob = (weblogic.jdbc.wrapper.Blob) cardSuitInfo.getCardFacePicFile();
oracle.sql.BLOB oracleBlob 
= (oracle.sql.BLOB) weblogicBlob.getVendorObj();
OutputStream out 
= oracleBlob.getBinaryOutputStream();
byte[] buffer = cardSuitInfoView.getCardFacePicFileBody();
out.write(buffer, 
0, buffer.length);
out.close();

session.save(cardSuitInfo);

 

 读取blob字段:

......
......
weblogic.jdbc.wrapper.Blob weblogicBlob 
=  (weblogic.jdbc.wrapper.Blob) cardSuitInfo.getCardBackPicFile();
oracle.sql.BLOB oracleBlob 
=  (oracle.sql.BLOB) weblogicBlob.getVendorObj();
BufferedInputStream in 
=   new  BufferedInputStream(oracleBlob.getBinaryStream());
long  picLong  =  cardSuitInfo.getCardBackPicFile().length();
byte [] bytes  =   new   byte [Integer.parseInt(picLong  +   "" )]; //
int  result  =  in.read(bytes);
if  (result  >   0 {
    downloadFileView.setFileByteArray(bytes);
}

in.close();

......
......

 

3.总结:

weblogic进行的封装,使我们必须加这步转换,如果用jdbc操作就不会出现此问题,而直接可以转化为oracle.sql.BLOB的对象。

重点步骤:

weblogic.jdbc.wrapper.Blob weblogicBlob = (weblogic.jdbc.wrapper.Blob) cardSuitInfo.getCardBackPicFile();

oracle.sql.BLOB oracleBlob = (oracle.sql.BLOB) weblogicBlob.getVendorObj();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值