欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

hibernate处理长字符串存储oracle 10g的clob类型

程序员文章站 2022-06-08 10:13:30
...

最近项目中(SSH2+ORACLE 10g)出现对长字符串处理的问题终于搞定了,在此记录一下

 

表中有一个字段 content clob

create table table_name

(

     ...

     content clob not null,

     ...

)

 

(1)在使用ojdbc14.jar的情况下(批量处理有影响)

使用注解

 @Lob
 @Basic(fetch = FetchType.EAGER)
 @Column(columnDefinition="CLOB", nullable=false)

 public String getContent() {
  return content;
 }

 如果设置了

<!-- 数据库批量更新数 -->
 hibernate.jdbc.batch_size=0

此时是没问题的

 

但设置了批量更新数的话就不可以了 如

hibernate.jdbc.batch_size=30

 

当汉字字符串长度大于666,插入数据必须使用流式方式,且最大长度不能超过2000个中文字符.当采用流式方式插入数据时,不能使用批处理

原因是PreparedStatement.setStringindex,StringValue)方法对StringValue的char长度有限制,并且一个中文字符占3个char,故只能输入666个汉字。插入英文字符时,至多只能插入2000个

 

(2)在使用classes12.jar的情况下(批量处理没有影响)

直接使用注解即可

 @Lob
 @Basic(fetch = FetchType.EAGER)
 @Column(columnDefinition="CLOB", nullable=false)

 public String getContent() {
  return content;
 }

 

或者使用

 @Type(type="org.springframework.orm.hibernate3.support.ClobStringType")
 public String getContent() {
  return content;
 }

此时要配置一下

<!--定义一个 lobHandler-->

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

 

<!--lobHandler必须注入到Hibernate会话工厂sessionFactory中-->

<bean id="sessionFactory"
  class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
   <property name="dataSource" ref="dataSource" />
  
   <property name="lobHandler" ref="lobHandler"/>

   ...

</bean>
 

 

至此  对象中直接申明成String就可以处理clob类型