1、配置hibernate:
1.1、配置hibernate的持久类文件中对应的字段为byte[]类型
2.2、配置hibernate的类映射文件中对应的字段type为
org.springframework.orm.hibernate3.support.BlobByteArrayType
2、配置spring:
2.1、配置nativeJdbcExtractor,如下:
<bean id="nativeJdbcExtractor" class="org.springframework.jdbc.support.nativejdbc.SimpleNativeJdbcExtractor" />
2.2、配置oracleLobHandler
<bean id="oracleLobHandler" class="org.springframework.jdbc.support.lob.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)
1.1、配置hibernate的持久类文件中对应的字段为byte[]类型
2.2、配置hibernate的类映射文件中对应的字段type为
org.springframework.orm.hibernate3.support.BlobByteArrayType
2、配置spring:
2.1、配置nativeJdbcExtractor,如下:
<bean id="nativeJdbcExtractor" class="org.springframework.jdbc.support.nativejdbc.SimpleNativeJdbcExtractor" />
2.2、配置oracleLobHandler
<bean id="oracleLobHandler" class="org.springframework.jdbc.support.lob.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)