環境:html
一、Oracle 9i 9.2.0.8.0java
二、jdbc:ojdbc5.jarspring
三、Spring 2數據庫
四、Hibernate 3session
系統中有個信息管理模塊,其中的信息內容使用了FCKeditor進行編輯,內容可能會很長,所以決定將該字段類型由varchar2改成clob。app
在網上查資料,聽說Oracle 10g和1.4及以上版本的JDBC已經支持使用String直接映射Clob,配置以下:fetch
Code
<property name="hibernate.connection.SetBigStringTryClob">true</property>
Code
<property name="clobContent" type="text" column="V_CONTENT"></property>
Code
private String clobContent;
詳見:Hibernate 中Clob字段的使用spa
惋惜咱們的環境並不支持這種簡單的配置,經多番查找資料和試驗,我採用了Spring的支持方式,配置以下:.net
Code
<!-- 對數據庫Blob字段和Clob字段的支持 -->
<bean id="nativeJdbcExtractor" class="org.springframework.jdbc.support.nativejdbc.SimpleNativeJdbcExtractor" 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>
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="app_ds"/>
<!-- 對數據庫Blob字段和Clob字段的支持 -->
<property name="lobHandler">
<ref local="lobHandler"/>
</property>
Code
<property name="clobContent" type="org.springframework.orm.hibernate3.support.ClobStringType" column="V_CONTENT"></property>
Code
private String clobContent;
PS:若是是用的註解來映射的話hibernate
/**
* nr:(內容)
* @since Ver 1.1
*/
@Lob
@Basic(fetch = FetchType.LAZY)
@Column(name="nr", columnDefinition="CLOB", nullable=true)
@Comment("內容")
private String nr;
這樣配置後,便可正常運行,不需改動代碼。
附:
一、JDBC版本很重要。最初咱們的lib下扔了兩個驅動classes12.jar和ojdbc5.jar,一直是classes12.jar在起做用,結果調試時讀取數據沒有問題,但寫入數據時報「沒法從套接字讀取更多的數據」的錯誤,刪除這個包後運行正常。
點擊查看classes12.jar和ojdbc的不一樣
二、varchar2轉clob的SQL
Code
ALTER TABLE tb_base_notify
ADD (v_content1 CLOB);
UPDATE tb_base_notify
SET v_content1=v_content;
ALTER TABLE tb_base_notify DROP COLUMN v_content;
ALTER TABLE tb_base_notify
RENAME COLUMN v_content1 TO v_content;