操作Clob時拋出Blob may not be manipulated from creating session.

http://nneverwei.iteye.com/blog/1027611


程序上需要將數據庫Clob字段轉換爲String,傳到前臺顯示。因此對Pojo添加了一個String型中間字段用於Clob的轉換。

問題就出在這裏,我們調用了Hibernate.createClob(xxx)將一個String轉爲Clob用於對象的保存。

但事實上,Hibernate.createClob創建出來的Clob對象與直接從數據庫查詢出來的Clob對象類型是不同的。

數據庫查詢出來的Clob與數據庫驅動實現具體相關。而createClob返回的是ClobImpl(hibernate的實現)。

 

翻看ClobImpl的源碼,發現hibernate對一些常用的方法,如getSubString(...)等根本沒有實現,而是直接丟一個異常出來(Blob may not be manipulated from creating session).

 

結論,使用Hibernate.createClob創建的Clob對象可以用於保存,但不適用於進一步的操作。(比如調用clob.getSubString字段)。

 

 

注:調用getSubString是爲了將Clob轉換爲String,用於頁面顯示。實際上後來發現了一種替代方案。ClobImpl對getSubString沒有實現,但對getCharacterStream是有實現的,因此可以使用下面的代碼:

Java代碼  收藏代碼
  1. try {  
  2.             String tmpStr = "";  
  3.             StringBuffer sb = new StringBuffer();  
  4.             BufferedReader br = new BufferedReader(bigColOri.getCharacterStream());  
  5.             while ((tmpStr=br.readLine())!=null){  
  6.                 sb.append(tmpStr);  
  7.             }  
  8.             return sb.toString();  
  9.         } catch (java.sql.SQLException e1) {  
  10.             e1.printStackTrace();  
  11.             return null;  
  12.         } catch (java.io.IOException e2) {  
  13.             e2.printStackTrace();  
  14.             return null;  
  15.         }  
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章