环境: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;