在spring中采用OracleLobHandler來處理oracle大字段(包括clob和blob),則在程序中不需要引用oracle的特殊類,從而能夠保證支持我們的代碼支持多數(shù)據(jù)庫。
1、首先數(shù)據(jù)表中的clob類型對應(yīng)java持久化類的String類型;而blob類型對應(yīng)byte[]類型
2、定義hibernate標(biāo)簽時(shí),持久化類中對應(yīng)clob類型的屬性的hibernate type應(yīng)為org.springframework.orm.hibernate.support.ClobStringType;而對應(yīng)blob類型的屬性的hibernate type應(yīng)為org.springframework.orm.hibernate.support.BlobByteArrayType。
3、以后訪問這些對應(yīng)clob和blob類型的屬性時(shí),按普通屬性處理,不需要特別編碼。
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為處理數(shù)據(jù)庫Lob字段,特別提供了LobHandler接口。在操作Oracle RDBMS過程中,由于Oracle JDBC Driver實(shí)現(xiàn)的問題,應(yīng)用必須采用Oracle原生的數(shù)據(jù)庫連接(比如,oracle.jdbc.OracleConnection)、LOB原生實(shí)現(xiàn)(比如,oracle.sql.BLOB、oracle.sql.CLOB)。因此,LobHandler接口存在上述兩種實(shí)現(xiàn)。簡而言之,為操作Oracle數(shù)據(jù)庫,必須使用OracleLobHandler實(shí)現(xiàn)。如果操作其他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的對應(yīng)的屬性類型為String。
需要注意兩點(diǎn):(1)如果使用Oracle9i自帶的class12.jar這個JDBC驅(qū)動的話是不行的,會報(bào)錯,據(jù)說要升級到classes12-9i.jar,我在Oracle的網(wǎng)站上沒找到對應(yīng)的下載,下載了ojdbc14.jar就可以了。(2)對Clob或Blog的操作必須在一個事務(wù)中進(jìn)行,如在Dao層測試會出錯,在配置了事務(wù)的Logic層就沒問題了。
經(jīng)過測試,如果用Oracle10g的JDBC驅(qū)動就沒這么麻煩了,Hibernate+Oracle+CLOB的讀寫其實(shí)只要這樣做:
1.在Oracle里設(shè)置某字段為clob類型。
2.在Hibernate的配置文件里使用網(wǎng)上下載的Oracle 10g最新的jdbc驅(qū)動。
3.實(shí)體類里把clob字段對應(yīng)的屬性類型設(shè)置為String。
4.hibernate的映射文件*.hbm.xml里把該字段對應(yīng)的類型該為text。
然后就可以在程序里把它當(dāng)成String隨便用了。
補(bǔ)充:按照上面的方法又寫了一個測試類,能夠操作Clob字段了,但是啟動JBOSS后就不能用了,后來找了很久才發(fā)現(xiàn),原來我用的JBOSS的default/lib目錄下也有一下老版本的Class12.jar,刪除它換成最新的ojdbc14.jar就可以了。