落Nicety的博客

专注于web2.0

   :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  11 随笔 :: 0 文章 :: 12 评论 :: 0 Trackbacks

2008年1月28日 #

项目中用到 长文本作为内容
pojo中使用 string 类型 数据 oracle9i 用的的clob字段
pojo:

private String content;
public void setContent(String content){
    
this.content = content;
}
hibernate配置
<property name="content" column="C_Content" type="text" length="10000"></property>

发现当content 字段的内容在 1000~2000 字符长度中间的时候出现 sql错误
而文本长度小于1000 长于2000 都没有问题
问题:hibernate配置中length="10000"属性是做什么用的?我尝试过 将他配置成1000,5000,1w或者不配置 最后执行的结果都一样

资料 google baidu。。。
一般认为 length指定的是text的最大长度,这里显然不是
又有认为 是将java中string 值当作clob处理的最小长度,也就是当string长度小于这个值的时候 当string处理,当string大于这个长度的时候当text(clob)处理。但是我将length设置为1000时,输入1k+文本 依然有sql错误。超过2000却没有问题。
so..这两个都不是答案.
又有人说,介个是jdbcbug 换成10g的就米有问题了。遂尝试..未果,问题依旧。
finally..这个length属性到底干嘛用 没搞清楚.. 抑或 不该这么配置?

继续寻找,找到另外一种解决办法。可以通过spring来解决这个问题
hibernate配置
<property name="content" column="C_Content" type="org.springframework.orm.hibernate3.support.ClobStringType"
length
="10000"></property>

spring配置
<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>
上面2个bean是关键
然后在sessionFactory的bean中加入
<bean id="sessionFactory"
        class
="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
        
<property name="lobHandler">   
            
<ref bean="oracleLobHandler" />   
        
</property>
        。。。其他
</bean>


问题解决,但是length="10000" 属性依然无用,可正常插入 任意长度的字符串
但是这样的话 数据库就不能跨平台了..so 期待跨数据库平台的 方案~~
posted @ 2008-01-28 15:48 落Nicety 阅读(455) | 评论 (4)编辑 收藏