JFinal Model.save() 方法 与 oracle jar版本冲突

整天散步的鱼 发布于 2013/03/25 13:50
阅读 599
收藏 1

@JFinal

说一下今天在使用JFinal时遇到的问题,描述如下,

表象:在对一个用户对象进行持久化的时候报错,Model.save(obj)报错信息如下:

com.jfinal.plugin.activerecord.ActiveRecordException: java.lang.ArrayIndexOutOfBoundsException: 11
	at com.jfinal.plugin.activerecord.Db.save(Db.java:628)
	at com.anst.controller.UserController.update(UserController.java:117)
	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.anst.interceptor.PrivilegeInterceptor.intercept(PrivilegeInterceptor.java:30)
	at com.jfinal.core.ActionInvocation.invoke(ActionInvocation.java:51)
	at com.anst.interceptor.AuthInterceptor.intercept(AuthInterceptor.java:36)
	at com.jfinal.core.ActionInvocation.invoke(ActionInvocation.java:51)
	at com.jfinal.ext.interceptor.SessionInViewInterceptor.intercept(SessionInViewInterceptor.java:44)
	at com.jfinal.core.ActionInvocation.invoke(ActionInvocation.java:51)
	at com.jfinal.core.ActionHandler.handle(ActionHandler.java:75)
	at com.jfinal.plugin.druid.DruidStatViewHandler.handle(DruidStatViewHandler.java:58)
	at com.jfinal.core.JFinalFilter.doFilter(JFinalFilter.java:72)
	at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1307)
	at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:453)
	at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:137)
	at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:560)
	at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:231)
	at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1072)
	at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:382)
	at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:193)
	at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1006)
	at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135)
	at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116)
	at org.eclipse.jetty.server.Server.handle(Server.java:365)
	at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:485)
	at org.eclipse.jetty.server.AbstractHttpConnection.content(AbstractHttpConnection.java:937)
	at org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.content(AbstractHttpConnection.java:998)
	at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:856)
	at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:235)
	at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:82)
	at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:628)
	at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:52)
	at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608)
	at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543)
	at java.lang.Thread.run(Thread.java:662)


在使用Db.save()方法测试后问题依旧,Debug后追踪到的错误代码为

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

 在直接运行生成的SQL后并无错误,这时候我想到可能是oracle jar版本的问题,测试库为oracle9i,之前我使用ojdbc14.jar,由于之前为了解决该库下使用ojdbc14.jar会导致Timestamp无法显示的问题,故换成了ojdbc6.jar。之后解决了Timestamp无法显示的问题。今天在遇到这个问题之后,我将jar换回了ojdbc14.jar,Model.save()方法可以正确执行。

 如下是持久化的程序片段,当属性小于8个的时候,Db.save()就能执行,当属性设置多于8个的时候便会报java.lang.ArrayIndexOutOfBoundsException的错误 。此问题可能不是JFinal的问题,但是在这里我想找到最终的原因,请大家协助一下。

User u = new User();
			
			u.set("id", "rcs_user_seq.nextval");
			u.set("empno", user.getEmpno());
			u.set("name", user.getName());
			u.set("username", user.getUsername());
			u.set("password", user.getPassword());
			u.set("email", user.getEmail());
			u.set("phone", user.getPhone());
			u.set("createuserid", sessUser.getNumber("id").intValue());
			u.set("modifyuserid", sessUser.getNumber("id"));
			u.set("groupid", user.getGroupid());
			
			u.set("createdate", new java.sql.Date(new Date().getTime()));
			u.set("modifydate", new java.sql.Date(new Date().getTime()));
			
			u.save();

以下是问题补充:

@整天散步的鱼:备注:使用JFinal版本1.2 (2013/03/25 14:14)
加载中
1
整天散步的鱼
整天散步的鱼

该问题已经解决:

解决方案为,使用最新版的jdbc驱动 “Oracle 数据库 11g 第 2 版 JDBC 驱动程序”, ojdbc6.jar替换之前可能是11g第一版的ojdbc6.jar.

0
绝望的八皮
绝望的八皮

恩驱动问题。。我以前也遇到过,但我想是否可以改善一下

PreparedStatement pst;

       if (DbKit.dialect.isOracle())

           pst = conn.prepareStatement(sql.toString(), new String[]{primaryKey});
让多个版本兼容??

@cwledit 知道否?

返回顶部
顶部