jfinal getModel(Class) 属性超过8个就报错了!

蚂蚁蚂蚁 发布于 2014/03/11 18:13
阅读 1K+
收藏 0

收藏!数据建模最全知识体系解读!>>>

表结构如下:

create table test(
id int,
a1 varchar2(200),
a2 varchar2(200),
a3 varchar2(200),
a4 varchar2(200),
a5 varchar2(200),
a7 varchar2(200),
a8 varchar2(200),
a9 varchar2(200),
a10 varchar2(200)
)



java代码如下:
Test test = getModel(Test.class);
		test.set("id", "seq_op.nextval");
		test.save();



提示错误信息如下:
Sql: insert into test(A2, A1, A4, A3, A5, A8, A7, ID, A10) values(?, ?, ?, ?, ?, ?, ?, seq_op.nextval, ?)

2014-03-11 21:00:41
[ERROR]-[Thread: qtp20698484-19]-[com.jfinal.core.ActionHandler.handle()]: /product/saveOrUpdateProduct
com.jfinal.plugin.activerecord.ActiveRecordException: java.lang.ArrayIndexOutOfBoundsException: 8
	at com.jfinal.plugin.activerecord.Model.save(Model.java:305)
	at cn.anycall.controller.ProdeuctController.saveOrUpdateProduct(ProdeuctController.java:129)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at com.jfinal.core.ActionInvocation.invoke(ActionInvocation.java:55)
	at com.jfinal.aop.ActionInvocationWrapper.invoke(ActionInvocationWrapper.java:45)



如果字段少于8个,可以插入!

if (DbKit.dialect.isOracle())
pst = conn.prepareStatement(sql.toString(), new String[]{tableInfo.getPrimaryKey()});
else

在这一句报错!

加载中
1
蚂蚁蚂蚁
蚂蚁蚂蚁

这是oracle的bug,请下载oracle 最新的jar,连接地址:http://download.oracle.com/otn/utilities_drivers/jdbc/11204/ojdbc6.jar

3
a
alvinte

首先,恭喜楼主问题得解,可喜可贺!

其次,感谢楼主解决问题后的分享。

但是我有几点建议想对楼主谏言(不喜勿看,打扰见谅):


第一,从此问题的最终解决来看。楼主的描述实在是不足以让别人更好的帮助你解决问题。首先,你的标题和你的问题就对不上。其次,关于问题描述,最开始你只是把error的stacktrace信息发布出来,这样别人根本就无法很好的帮你判断问题,后来你对描述还更新过一次,加上了表结构和代码,但实际问题是在于oracle的驱动问题,你的描述也没有突出你用的是oracle的这个重点。为了让别人更好的帮助你,望今后把重点信息表述出来,感谢!

第二,对于问题的解决你也没有描述清楚。首先,prepareStatement这个API的文档说明并不能说明oracle驱动的这个bug,对于问题的解决没有实际的帮助。其次,你附带的那个csdn的帖子里面也对这个bug没有任何明确的说明,而且那个帖子最后的一个回复者所述,换驱动并没有解决同样的问题,这样让读者对此bug的描述和解决难免产生质疑,缺乏可信度。 虽然我又去stackoverflow确认过了,确实是oracle的jdbc驱动的问题,但是单就此问题的分享的角度,楼主的答案并没有充分体现出分享的价值。为了给大家带来更好的帮助,望楼主以后在回答的时候能给出更权威可信的答案。

ps:我附上stackoverflow对oracle驱动bug的帖子,作为对楼主的补充,供大家参考:http://stackoverflow.com/questions/277744/jdbc-oracle-arrayindexoutofboundsexception

文中还描述了一种workaround的解决方案,请大家参阅。

以上!万谢!

JFinal
JFinal
大家看过来,这个才是最佳答案 ^_^
蚂蚁蚂蚁
蚂蚁蚂蚁
谢谢提醒,以后多加注意!
0
a
alvinte
这。。。。。这个和8个有什么关系啊,直觉上感觉是你传进去的paras的size根本就不够吧。你调试看一下当时的数据是怎么样的?而且你这标题。。。是怎么回事?你这错误是在save时候的,为什么标题是说getModel的问题?你是说getModel没有给你取到9个属性么?
蚂蚁蚂蚁
蚂蚁蚂蚁
回复 @小兵一枚 : 呵呵,什么要侮辱,有问题提提怎么了,不要盲目的崇拜!问题原因是oracle的bug!
魔法王者安琪拉
魔法王者安琪拉
回复 @蚂蚁蚂蚁 : 不要侮辱强大的JFinal亲
蚂蚁蚂蚁
蚂蚁蚂蚁
莫非你们都是小表!
0
本人纯属虚构
本人纯属虚构

java.lang.ArrayIndexOutOfBoundsException: 8


下次提问还是先检查下错误再提吧

0
蚂蚁蚂蚁
蚂蚁蚂蚁

查了查api,如下:

prepareStatement
PreparedStatement prepareStatement(String sql,
                                   String[] columnNames)
                                   throws SQLException
创建一个能返回由给定数组指定的自动生成键的默认 PreparedStatement 对象。此数组包含目标表中列的名称,而目标表包含应该返回的自动生成键。如果 SQL 语句不是 INSERT 语句,或者 SQL 语言能够返回自动生成的键(这类语句的列表是特定于供应商的),则驱动程序将忽略该数组。 
带 IN 参数或不带 IN 参数的 SQL 语句都可以被预编辑并存储在 PreparedStatement 对象中。然后可以使用此对象多次有效地执行该语句。 

注:为了处理受益于预编译的带参数 SQL 语句,此方法进行了优化。如果驱动程序支持预编译,则 prepareStatement 方法将该语句发送给数据库进行预编译。一些驱动程序可能不支持预编译。在这种情况下,执行 PreparedStatement 对象之前无法将语句发送给数据库。这对用户没有直接影响;但它的确会影响哪些方法将抛出某些 SQLException。 

使用返回的 PreparedStatement 对象创建的结果集在默认情况下类型为 TYPE_FORWARD_ONLY,并带有 CONCUR_READ_ONLY 并发级别。已创建结果集的可保存性可调用 getHoldability() 确定。 


参数: sql - 可能包含一个或多个 '?' IN 参数占位符的 SQL 语句 columnNames - 列名称数组,这些名称指示应该从一个或多个插入行中返回的那些列 返回: 一个包含预编译语句的新 PreparedStatement 对象,该对象能够返回由给定列名称数组指定的自动生成键 抛出: SQLException - 如果发生数据库访问错误,或者在关闭的连接上调用此方法 SQLFeatureNotSupportedException - 如果 JDBC 驱动程序不支持此方法



魔法王者安琪拉
魔法王者安琪拉
嗯嗯,这才是正解吗
0
JFinal
JFinal
感谢楼主解决问题后回来分享,此贴应该放在技术分享区哈 
返回顶部
顶部