使用Hibernate/Spring簡化對Oracle中CLOB/BLOB的操作

曾經對Oracle中CLOB或BLOB存取的人,一定對它恨的牙癢癢的,光是要寫入一個BLOB,
就要先塞入一個EMPTYBLOB、再把資料讀出來,再將要寫入的二進位資料流。真的是相當的煩人。

自從用了Spring/Hibernate的Framework後,很多瑣碎的操作,都不需要自己寫程式處理,只要
專心做Biz Logic即可,尤其是像BLOB/CLOB的處理。

若要使用Spring/Hibernate來幫我們處理BLOB/CLOB的話,總共有三個步驟

一、修改Hibernate Mapping檔中,Blob/Clob的資料型態
二、修改POJO(Domain Entity)中,Blob/Clob的資料型態
三、在Spring的設定檔中,增加對Blob/Clob的物件。

詳細的設定如下:
一、修改Hibernate Mapping檔中,Blob/Clob的資料型態

將hbm.xml對應該欄位改成其對應的欄位
BLOB:org.springframework.orm.hibernate3.support.BlobByteArrayType
CLOB:org.springframework.orm.hibernate3.support.ClobStringType
<hibernate-mapping>
<class name="OracleLob" table="LOB" schema="TEST" lazy="false">
…
<property name="content" type="org.springframework.orm.hibernate3.support.ClobStringType" column="CLOB" />
<property name="file" type="org.springframework.orm.hibernate3.support.BlobByteArrayType" lazy="true" column="FILE_CONTENT" not-null="true" />
…
</class>
</hibernate-mapping>


二、修改POJO(Domain Entity)中,Blob/Clob的資料型態
POJO,代表BLOB的資料型態為byte[]
POJO,代表CLOB的資料型態為String

public class OracleLob{
  private byte[] file;
  private String content;
}


三、在Spring的設定檔中,增加對Blob/Clob的物件。

<!-- Oracle BLOB/CLOB Handler -->

<bean id="nativeJdbcExtractor" class="org.springframework.jdbc.support.nativejdbc.WebLogicNativeJdbcExtractor" lazy-init="true"></bean>  

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


其中NativeJdbcExtractor,要依據不同的AP來設定,spring提供的有
C3P0NativeJdbcExtractor,
CommonsDbcpNativeJdbcExtractor,
JBossNativeJdbcExtractor,
SimpleNativeJdbcExtractor,
WebLogicNativeJdbcExtractor,
WebSphereNativeJdbcExtractor,
XAPoolNativeJdbcExtractor

這樣一來,就可以透過String來處理CLOB,byte[]來處理BLOB了。

留言

熱門文章