SSH框架中关于clob字段的处理跟踪

由一个bug更改而引发的一系列问题。。。

项目场景:

在信息导航管理模块中,编辑一条信息内容,此内容字段为clob类型,点击“保存”按钮,后台报错“ORA-01461: 仅能绑定要插入 LONG 列的 LONG 值”。

一直以为是字段映射hibernate的问题,就从这些映射文件中查找问题,以为是hibernate对clob字段操作的问题,最终发现是sys_log表url字段过长而导致此错误;

------------------------------------------------------------------------------------------------

特此将google中的搜索记录如下:

1、ORA-01461: 仅能绑定要插入 LONG 列的 LONG 值

检查插入的值是否大于该字段数据类型约束的长 度。

这个异常是指,用户向数据库执行插入数据操作时,某条数据的某个字段值过长,如果是varchar2类型的,当长度超过2000,--4000(最 大值)之间的时候,oracle会自动将该字段值转为long型的,然后,插入操作失败。解决办法是:将此字段的类型改为clob或者blob类型;

网络资料链接:http://hi.baidu.com/chengchaos/item/05e3a385167297dfd0f8cd7b

 

2、内容字段确认为clob字段,再接着往下想,是不是clob字段在映射类型为String时出错了呢,顺着思路进行查找。

google搜索“hibernate clob”,查看资料五花八门,大致说hibernate对clob处理的问题,以及跟项目所使用的jar包也有关联,

也提出了一些解决方案,大部分搜索资料上都提到的方法,就是在hibernate.cfg.xml中添加一行配置:

<property name="hibernate.connection.SetBigStringTryClob">true</property>

这样在映射类和映射配置文件中,将clob字段映射为"String"即可,新增和修改时使用的是java.sql.Clob进行这些字段的转换,此功能是否有效,没有实验,且公司框架为ssh集合,思考着此类配置应该已经得到处理,或是Spring配置接管对clob的处理。

网络资料链接:http://www.360doc.com/content/13/0321/10/9629506_272861105.shtml

 

3、当前公司使用框架是应用多年的框架,对于clob字段的使用会有相关配置,于是从新查找ssh 对clob字段的处理。

框架中使用的Spring对clob类型的处理,详细可参考资料:http://www.blogjava.net/allen-zhe/archive/2008/05/06/198627.html

这篇文件讲的非常详细,Spring中已对clob字段的解决方案已进行配置,随后定位发生错误是映射配置文件关于clob的类型配置错误;

 

当处理clob类型的字段时,对应实体类成员变量的类型为java.lang.String,映射配置文件的数据库字段类型为org.springframework.orm.hibernate.support.ClobStringType

另有一篇资料有详细说明:http://blog.csdn.net/ilibaba/article/details/3742367

顺便说下另外一种数据类型blob所对应实体类的字段为 byte[] , 映射配置文件的数据库字段类型为:org.springframework.orm.hibernate3.support.BlobByteArrayType

关于二种类型的使用情况:大文本型的字段,大多设置为clob,而对于存储图片、文档等类型文件时应设置为blob

 

 4、更改完配置,进行debug断点跟踪,发现在记录日志时,也有错误,这个是导致“ORA-01461: 仅能绑定要插入 LONG 列的 LONG 值”的原因。

原因是在取提交的url时,

RequestHelper requestHelper=new DefaultRequestHelper(request,response);
String url=requestHelper.getHref().toString();

得到的url包括提交所带的参数,包括提交的大字段内容都在里面,所以在往sys_log表中保存时,报了字段超长的错误,至此告一段落。

你可能感兴趣的:(clob)