JBPM4.4部署JBOSS4.0.5异常解决

1.异常信息显示

org.hibernate.exception.SQLGrammarException: could not execute query
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:67)
    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
    at org.hibernate.loader.Loader.doList(Loader.java:2147)
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2028)
    at org.hibernate.loader.Loader.list(Loader.java:2023)
    at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:393)
    at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:338)
    at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:172)
    at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1121)
    at org.hibernate.impl.QueryImpl.list(QueryImpl.java:79)
    at org.hibernate.impl.AbstractQueryImpl.uniqueResult(AbstractQueryImpl.java:780)
    at org.jbpm.pvm.internal.query.AbstractQuery.execute(AbstractQuery.java:93)
    at org.jbpm.pvm.internal.query.TaskQueryImpl.execute(TaskQueryImpl.java:231)
    at org.jbpm.pvm.internal.query.AbstractQuery.execute(AbstractQuery.java:83)
    at org.jbpm.pvm.internal.svc.DefaultCommandService.execute(DefaultCommandService.java:42)
    at org.jbpm.pvm.internal.svc.SkipInterceptor.execute(SkipInterceptor.java:40)
    at org.jbpm.pvm.internal.query.AbstractQuery.untypedUniqueResult(AbstractQuery.java:74)
    at org.jbpm.pvm.internal.query.TaskQueryImpl.uniqueResult(TaskQueryImpl.java:259)


Caused by: java.sql.SQLException: ORA-01722: 无效数字

    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
    at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:331)
    at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:288)
    at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:743)
    at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:213)
    at oracle.jdbc.driver.T4CPreparedStatement.executeForRows(T4CPreparedStatement.java:952)
    at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:1054)
    at oracle.jdbc.driver.T4CPreparedStatement.executeMaybeDescribe(T4CPreparedStatement.java:836)
    at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1124)
    at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3285)
    at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:3329)
    at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:186)
    at org.hibernate.loader.Loader.getResultSet(Loader.java:1668)
    at org.hibernate.loader.Loader.doQuery(Loader.java:662)
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:224)
    at org.hibernate.loader.Loader.doList(Loader.java:2144)
    ... 93 more

2.问题分析

从“Caused by: java.sql.SQLException: ORA-01722: 无效数字“这个异常信息可以看出,是在sql查询时,where后面的条件本来是数字类型,但是赋值时为字符串类型导致的,经过debbug跟踪查看,导致到问题的原因是在org.jbpm.pvm.internal.query.TaskQueryImpl.execute方法中的hql语句select task from TaskImpl task where task.processInstance.id=‘PD...........’,不同的hibernate版本翻译成的sql语句不同,只有在hibernate3.2.2以上的版本中,翻译的语句才是正确的,所以一定要确保在集成JBPM4.4的项目中的hibernate版本是3.2.2以上的版本。

但是在把hibernate3.2.3的jar替换添加到项目的lib中后,发布到JBOSS4.0.5上,启动发现还是报以上的错误,这时就要想想了,应该是在哪个地方还是有hibernate3.2.2或者以下的包存在,所以就想到是JBOSS容器自身的lib中,查看server\default\lib中hibernate的jar的版本,发现JBOSS4.0.5的这个版本中的jar是3.2.0的,根据JBOSS容器的classpath的加载优先级别,jboss的核心jar和server\default\lib中的jar优先于war中的jar加载,所以实际使用的还是hibernate3.2.0的jar。

3.问题解决

替换项目war中的web-inf\lib中的hibernate中的jar,确保为hibernate3.2.3或者以上的版本。

替换JBOSS4.0.5server\default\lib中的hibernate的jar,确保为hibernate3.2.3或者以上的版本。

4.补充说明

由于在JBOSS4不同版本中,hibernate的版本不同,所以在JBOSS4中发布JBPM4.4的项目,一定要检查JBOSS自带的hibernate的jar的版本。或者一次性到位将JBOSS换成JBOSS4.2.3的版本,里面带的hibernate为3.2.4的版本。


你可能感兴趣的:(JBPM4.4部署JBOSS4.0.5异常解决)