用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();

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章