Spring或Hibernate其實都提供了透明處理Clob的方法
只是我的以爲用Spring的作法比hibernate更透明一點(hibernate2.16);
具體作法爲:
1.在sessionFactory中加入lobHandler的注射:java
<bean id="sessionFactory" class="org.springframework.orm.hibernate.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="lobHandler" ref="lobHandler"/>
<property name="mappingResources">
<value>xxx.hbm.xml</value>
.....
</property>
</bean>spring
2.定義這個lobHandler,值得注意的是這裏有Oracle的版本區別:數據庫
<bean id="lobHandler" lazy-init="true" class="org.springframework.jdbc.support.lob.OracleLobHandler">
<property name="nativeJdbcExtractor">
<ref bean="nativeJdbcExtractor"/>
</property>
</bean>session
<bean id="nativeJdbcExtractor" lazy-init="true" class="org.springframework.jdbc.support.nativejdbc.SimpleNativeJdbcExtractor"/>app
由於Oracle9i處理Clob的方式和別的數據庫很不同,甚至與Oracle10g都不兼容,因此這裏要用spring提供的SimpleNativeJdbcExtractor.若是使用Oracle10g的話,能夠直接使用:ui
<bean id="lobHandler" lazy-init="true" class="org.springframework.jdbc.support.lob.DefaultLobHandler"/>hibernate
對應的應該使用Oracle10g對應的JDBC驅動.orm
4.在領域對象的hbm中對應的Clob字段應該使用這樣的定義:xml
<property name="context" column="context" type="org.springframework.orm.hibernate.support.ClobStringType" length="1048576000"/>對象
這裏的length是字節了,不是長度哦,最大能夠設到2G.對應的,該字段在領域對象中直接申明成String就能夠了.當對這個字段寫入長數據時直接調用其set方法就能夠了,Spring會本身幫你作餘下的處理,讓你透明的處理Clob字段.
5.業務邏輯層對該字段的操做必須須要在有事務管理的方法中使用,不然會報:java.lang.IllegalStateException: Active Spring transaction synchronization or active JTA transaction with 'jtaTransactionManager' on LocalSessionFactoryBean required 這個錯誤