首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 开源软件 >

spring+hibernate中处置oracle BLOB

2012-07-08 
spring+hibernate中处理oracle BLOB1、配置hibernate:1.1、配置hibernate的持久类文件中对应的字段为byte[]

spring+hibernate中处理oracle BLOB
1、配置hibernate:
     1.1、配置hibernate的持久类文件中对应的字段为byte[]类型
     2.2、配置hibernate的类映射文件中对应的字段type为

     org.springframework.orm.hibernate3.support.BlobByteArrayType
2、配置spring:
     2.1、配置nativeJdbcExtractor,如下:

           <bean    id="nativeJdbcExtractor"     />
 

     2.2、配置oracleLobHandler
        <bean id="oracleLobHandler"    lazy-init="true">
          <property name="nativeJdbcExtractor">
              <ref bean="nativeJdbcExtractor" />
          </property>
        </bean>


    2.3把oracleLobHandler加入sessionFactory中:
       <property name="lobHandler">
           <ref bean="oracleLobHandler" />
      </property>


3、总结:
     正确配置以上两条,就可以像处理普通的对象一样处理oracle的大对象。而且可以方面的从oracle上移植到支持大对象的其他数据库上,屏蔽了不同数据库处理lob字段的差别;


4、扩展:
     4.1、处理clob对象也很方便,在配置hibernate时把对应的类的属性字段配置为String,映射文件type配置为org.springframework.orm.hibernate3.support.ClobStringType就行了。

          <property name="context" column="context" type="org.springframework.orm.hibernate.support.ClobStringType" length="1048576000"/>

          这里的length是字节了,不是长度,最大可以设到2G.对应的,该字段在领域对象中直接申明成 String就可以了.当对这个字段写入长数据时直接调用其set方法就可以了,Spring会自己帮你做余下的处理,让你透明的处理Clob字段.

业务逻辑层对该字段的操作必须需要在有事务管理的方法中使用,否则会报:
java.lang.IllegalStateException: Active Spring transaction synchronization or active JTA transaction with 'jtaTransactionManager' on LocalSessionFactoryBean required 这个错误

因为Oracle9i处理Clob的方式和别的数据库很不一样,甚至与Oracle10g都不兼容,所以这里要用spring提供的SimpleNativeJdbcExtractor.如果使用Oracle10g的话,可以直接使用:

<bean id="lobHandler" lazy-init="true"    class="org.springframework.jdbc.support.lob.DefaultLobHandler"/>

对应的应该使用Oracle10g对应的JDBC驱动.

如果使用以上方法开始报如下错误,把class12.jar换成ojdbc14.jar就ok了

04-24 15:31:33.242 WARN    [FileCopyUtils.java:237] Could not close Writer
java.io.IOException: 无法从套接字读取更多的数据 at oracle.jdbc.dbaccess.DBError.SQLToIOException(DBError.java:716)
at oracle.jdbc.driver.OracleClobWriter.flushBuffer(OracleClobWriter.java:270)
at oracle.jdbc.driver.OracleClobWriter.close(OracleClobWriter.java:232)



热点排行