spring+hibernate的clob大字段處理(轉載于javaeye論壇)

在spring中如何處理oracle大字段

在spring中采用OracleLobHandler來處理oracle大字段(包括clob和blob),則在程序中不需要引用oracle的特殊類,從而能夠保證支持我們的代碼支持多數據庫。

1、首先數據表中的clob類型對應java持久化類的String類型;而blob類型對應byte[]類型
2、定義hibernate標簽時,持久化類中對應clob類型的屬性的hibernate type應為org.springframework.orm.hibernate.support.ClobStringType;而對應blob類型的屬性的hibernate type應為org.springframework.orm.hibernate.support.BlobByteArrayType。
3、以后訪問這些對應clob和blob類型的屬性時,按普通屬性處理,不需要特別編碼。

java代碼:  

 < bean  id ="mySessionFactory2"  class ="org.springframework.orm.hibernate.LocalSessionFactoryBean" >  
         
< property  name ="dataSource" >  
                 
< ref  bean ="myDataSource2" />  
          
</ property >  
          
< property  name ="lobHandler" >  
         
< ref  bean ="oracleLobHandle" />  
          
</ property >   
 
</ bean >  
 
< bean  id ="nativeJdbcExtractor"  class ="org.springframework.jdbc.support.nativejdbc.SimpleNativeJdbcExtractor" />  

 
< bean  id ="oracleLobHandle"  class ="org.springframework.jdbc.support.lob.OracleLobHandler"  Lazy-init ="true" >  
 
< property  name ="nativeJdbcExtractor" >  
     
< ref  local ="nativejdbcExtractor" />  
 
</ property >  
 
</ bean > 

Spring為處理數據庫Lob字段,特別提供了LobHandler接口。在操作Oracle RDBMS過程中,由于Oracle JDBC Driver實現的問題,應用必須采用Oracle原生的數據庫連接(比如,oracle.jdbc.OracleConnection)、LOB原生實現(比如,oracle.sql.BLOB、oracle.sql.CLOB)。因此,LobHandler接口存在上述兩種實現。簡而言之,為操作Oracle數據庫,必須使用OracleLobHandler實現。如果操作其他RDBMS類型,則使用DefaultLobHandler。NativeJdbcExtractor是個接口,通過它能夠抽象各種連接池。另外Spring還提供兩個接口存取Blob,LobCreator及LobHandler

hbm文件配置

<property name="content" column="C_Content" type="org.springframework.orm.hibernate3.support.ClobStringType"
length
="10000"></property>


 JavaBean的對應的屬性類型為String。

需要注意兩點:(1)如果使用Oracle9i自帶的class12.jar這個JDBC驅動的話是不行的,會報錯,據說要升級到classes12-9i.jar,我在Oracle的網站上沒找到對應的下載,下載了ojdbc14.jar就可以了。(2)對Clob或Blog的操作必須在一個事務中進行,如在Dao層測試會出錯,在配置了事務的Logic層就沒問題了。

經過測試,如果用Oracle10g的JDBC驅動就沒這么麻煩了,Hibernate+Oracle+CLOB的讀寫其實只要這樣做:

1.在Oracle里設置某字段為clob類型。
2.在Hibernate的配置文件里使用網上下載的Oracle 10g最新的jdbc驅動。
3.實體類里把clob字段對應的屬性類型設置為String。
4.hibernate的映射文件*.hbm.xml里把該字段對應的類型該為text。

然后就可以在程序里把它當成String隨便用了。

補充:按照上面的方法又寫了一個測試類,能夠操作Clob字段了,但是啟動JBOSS后就不能用了,后來找了很久才發現,原來我用的JBOSS的default/lib目錄下也有一下老版本的Class12.jar,刪除它換成最新的ojdbc14.jar就可以了。