CLOB字段含义:是文本类型的大对象,一般varch2字段的长度在4000以内,超出2000的话一般就需要用clob字段,否则会报错:
<!--Oracle10g的配置 对应的应该使用Oracle10g对应的JDBC驱动 -->
<bean id="oracleLobHandler" lazy-init="true" class="org.springframework.jdbc.support.lob.DefaultLobHandler"/>
ORA-01461: 仅能绑定要插入 LONG 列的 LONG 值
当varchar2类型的长度超过2000至4000(最大值)之间的时候,oracle会自动将该字段值转为long型的。
1,在spring的配置文件中配置:
<!-- 解决CLOB -->
<!-- Oracle9i的配置-->
<bean id="oracleLobHandler" class ="org.springframework.jdbc.support.lob.OracleLobHandler" lazy-init ="true" >
<property name ="nativeJdbcExtractor" ref ="nativeJdbcExtractor"/>
</bean >
<bean id="nativeJdbcExtractor"
class ="org.springframework.jdbc.support.nativejdbc.CommonsDbcpNativeJdbcExtractor"
lazy-init ="true"/>
<!-- Oracle9i的配置-->
<bean id="oracleLobHandler" class ="org.springframework.jdbc.support.lob.OracleLobHandler" lazy-init ="true" >
<property name ="nativeJdbcExtractor" ref ="nativeJdbcExtractor"/>
</bean >
<bean id="nativeJdbcExtractor"
class ="org.springframework.jdbc.support.nativejdbc.CommonsDbcpNativeJdbcExtractor"
lazy-init ="true"/>
<!--Oracle10g的配置 对应的应该使用Oracle10g对应的JDBC驱动 -->
<bean id="oracleLobHandler" lazy-init="true" class="org.springframework.jdbc.support.lob.DefaultLobHandler"/>
并且将oracleLobHandler加入到SessionFactory中去,即在
<bean id="mySessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean" >
...
中加入<property name="oracleLobHandler" ref="oracleLobHandler"></property>
...
</bean>关联起来,到这里spring里的配置已经完成.
<bean id="mySessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean" >
...
中加入<property name="oracleLobHandler" ref="oracleLobHandler"></property>
...
</bean>关联起来,到这里spring里的配置已经完成.
2,在hbm.xml的映射文件中配置:
<property name="description" column="DESCRIPTION"
type="org.springframework.orm.hibernate3.support.ClobStringType"
update="false"
insert="true" />
type="org.springframework.orm.hibernate3.support.ClobStringType"
update="false"
insert="true" />
注:
update="false"这样的设置会让CLOB的操作更加稳定(因为完全交给JDBC来做);
insert="true"若设置为false时,保存不了数据到该字段中;
更新时读取CLOB字段为NULL时转换会报错,所以将此字段设置为
alter table A modify DESCRIPTION default EMPTY_CLOB() ;
alter table A modify DESCRIPTION default EMPTY_CLOB() ;
3,业务逻辑层对该字段的操作必须需要在有事务管理的类以及方法中使用,否则会报:
java.lang.IllegalStateException: Active Spring transaction synchronization or active JTA transaction with 'jtaTransactionManager' on LocalSessionFactoryBean required
java.lang.IllegalStateException: Active Spring transaction synchronization or active JTA transaction with 'jtaTransactionManager' on LocalSessionFactoryBean required
当然如果以上配置都已近存在了的话,我们也可以通过语句来操作:
DELETE A;
alter TABLE A modify DESCRIPTION long;
alter TABLE A modify DESCRIPTION clob;