今天在开发项目的时候遇到CLOB字段的问题,和平时的String字段一样处理发现HQL的查询结果是NULL,到网上查找了一些资料,处理方式作了一些修改以后,数据成功显示,现总结配置如下:
1.spring的配置文件 (applicationContext-hibernate.xml)
说明,这是我们系统中的文件名,不同系统会有不同,主要是Spring+hibernate 结合,sessionfactory的注入的配置:
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="lobHandler">
<ref bean="oracleLobHandler" />
</property>
<property name="mappingResources">
<list> <value>aicu/application/vimp/model/sys/tbl/AiUploadLog.hbm.xml</value></list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.Oracle9Dialect
</prop>
<prop key="hibernate.show_sql">false</prop>
<!-- Create/update the database tables automatically when the JVM starts up
<prop key="hibernate.hbm2ddl.auto">update</prop> -->
<!-- Turn batching off for better error messages under PostgreSQL
<prop key="hibernate.jdbc.batch_size">0</prop> -->
</props>
</property>
</bean>
<bean id="oracleLobHandler"
class="org.springframework.jdbc.support.lob.OracleLobHandler">
<property name="nativeJdbcExtractor">
<ref local="nativeJdbcExtractor" />
</property>
</bean>
<bean id="nativeJdbcExtractor"
class="org.springframework.jdbc.support.nativejdbc.SimpleNativeJdbcExtractor">
</bean>
请注意:oracleLobHandler,nativeJdbcExtractor,注意蓝色配置
Spring或Hibernate其实都提供了透明处理Clob的方法: 具体做法为:
(1)在sessionFactory中加入lobHandler的注射:
- <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>
(2).定义这个lobHandler,值得注意的是这里有Oracle的版本区别:
提示: 指定lobHandler时,对于MySQL、DB2、MS SQL Server、Oracle 10g,使用DefaultLobHandler即可.
而Oracle 9i,则可以使用OracleLobHandler。因为Oracle9i处理lob的方式和不太一样,所以这里要用spring提供的SimpleNativeJdbcExtractor.处理Oracle9i lob类型的特殊声明:
2. *.hbm.xml配置修改如下:
a:操作blob,java类的成员变量类型设置为byte[],映射文件设置为:org.springframework.orm.hibernate3.support.BlobByteArrayType
b:操作clob,java类的成员变量类型设置为String,映射文件设置为:
org.springframework.orm.hibernate3.support.ClobStringType<property
name="xmldata"
type="org.springframework.orm.hibernate3.support.ClobStringType"
update="true"
insert="true"
access="property"
column="XMLDATA"
not-null="false"
unique="false"
/>3. 在领域对象的hbm中对应的Clob字段应该使用这样的定义:
public HelloWorld {
private String xmlData;
//setter和getter
}
完毕 ok!
- <bean id="lobHandler" lazy-init="true" class="org.springframework.jdbc.support.lob.OracleLobHandler">
- <property name="nativeJdbcExtractor">
- <ref bean="nativeJdbcExtractor"/>
- </property>
- </bean>
- <bean id="nativeJdbcExtractor" lazy-init="true" class="org.springframework.jdbc.support.nativejdbc.SimpleNativeJdbcExtractor"/>