`
FQ_kevin
  • 浏览: 14501 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

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

阅读更多

最近项目中(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类型  

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics