由一个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类型;
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的处理。
3、当前公司使用框架是应用多年的框架,对于clob字段的使用会有相关配置,于是从新查找ssh 对clob字段的处理。
这篇文件讲的非常详细,Spring中已对clob字段的解决方案已进行配置,随后定位发生错误是映射配置文件关于clob的类型配置错误;
当处理clob类型的字段时,对应实体类成员变量的类型为java.lang.String,映射配置文件的数据库字段类型为org.springframework.orm.hibernate.support.ClobStringType
另有一篇资料有详细说明:
顺便说下另外一种数据类型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表中保存时,报了字段超长的错误,至此告一段落。