基于Hibernate的应用程序的开发过程中,通过Hibernate操作数据库时,在程序执行过程中出现了SQL Grammer Exception,Could not execute JDBC batch update的提示信息。遇到此类问题确实让人感觉摸不着头脑(尤其是第一次遇到),不过解决此类问题并不需要大动干戈地大规模修改代码,也不需要做更改数据库连接方式这样动用牛刀的事。问题的来源还在于细节上出了问题。
此类问题的出现主要来自三个方面。
1、 SQL语句中存在语法错误或是传入的数据有误;
2、 数据库的配置不合法,或者说是配置有误。较容易出现的有数据表的映射文件(,hbm.xml文件)配置有误;Hibernate.cfg.xml文件配置有误;
3、 当前的数据库用户权限不足,不能操作数据库。以是以Oracle 数据库为例,这种情况下在错误提示中会显示java.sql.BatchUpdateException: ORA-01031: insufficient privileges这样的信息。
以下是我在项目中解决SQL Grammer Exception,Could not execute JDBC batch update异常时使用的方法。
首先,根据错误提示信息查看数据表的映射文件是否配置正确,映射的列名、属性是否正确;
其次,如果提示信息中存在insufficient privileges这样的信息则查看当前使用的数据库用户是否有对当前操作的数据库、数据表具有操作权。在解决这个问题是,我也在网上找了这类问题的很多资料,造成此类问题的发生绝大多数情况下是由于数据库配置错误,或者是操作的表、数据库无权限。
再者,如果上述都没问题,那么很可能是传入的数据非法或是SQL语句不合法(比较常见的是在SQL语句中使用了默认的关键字,如Date,User之类)。并采用Debug跟踪的方式查看传入SQL语句中的变量是否正确,是否合法。
以上便是我使用的一些经验和方法。解决这个问题应该说花费了我很长的时间,差不多有一天半吧,最后才发现是由于数据库权限不足造成的。走了很多弯路啊…不过还好,还是解决了。呵呵….
接下来我把当时的出错信息粘出来,希望对遇到此类问题的朋友能有所帮助。
出错提示信息如下:
Hibernate: insert into XT_JYSHQ (ZQJC, ZSP, JKP, ZGJ, ZDJ, YJLX, SPJ, CJL, CJJE, JYRQ, ZQDM) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
2007-07-26 09:55:17,000 >> WARN >> org.hibernate.util.JDBCExceptionReporter.logExceptions(JDBCExceptionReporter.java:71) >> SQL Error: 1031, SQLState: 42000
2007-07-26 09:55:17,000 >> ERROR >> org.hibernate.util.JDBCExceptionReporter.logExceptions(JDBCExceptionReporter.java:72) >> ORA-01031: insufficient privileges
2007-07-26 09:55:17,000 >> WARN >> org.hibernate.util.JDBCExceptionReporter.logExceptions(JDBCExceptionReporter.java:71) >> SQL Error: 1031, SQLState: 42000
2007-07-26 09:55:17,000 >> ERROR >> org.hibernate.util.JDBCExceptionReporter.logExceptions(JDBCExceptionReporter.java:72) >> ORA-01031: insufficient privileges
2007-07-26 09:55:17,000 >> ERROR >> org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:299) >> Could not synchronize database state with session
org.hibernate.exception.SQLGrammarException: Could not execute JDBC batch update
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:65)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:202)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:230)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:140)
.(有略)
[insert into XT_JYSHQ (ZQJC, ZSP, JKP, ZGJ, ZDJ, YJLX, SPJ, CJL, CJJE, JYRQ, ZQDM) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)]; nested exception is java.sql.BatchUpdateException: ORA-01031: insufficient privileges
java.sql.BatchUpdateException: ORA-01031: insufficient privileges
at oracle.jdbc.dbaccess.DBError.throwBatchUpdateException(DBError.java:459)
at oracle.jdbc.driver.OraclePreparedStatement.executeBatch(OraclePreparedStatement.java:3907)
at org.apache.commons.dbcp.DelegatingStatement.executeBatch(DelegatingStatement.java:294)
at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:58)
at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:195)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:230)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:140)
(有略)