错误:org.hibernate.exception.SQLGrammarException: could not execute

于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语句中的变量是否正确,是否合法。
 
以上便是我使用的一些经验和方法。解决这个问题应该说花费了我很长的时间,差不多有一天半吧,最后才发现是由于数据库权限不足造成的。走了很多弯路啊…不过还好,还是解决了。呵呵….
===========================
今天我也碰到这个问题了  发现原因是 数据库中的表里的列名是mysql的关键字  很无奈. 由于种种原因,已经不能修改数据库里的表的列名了.
原来配置文件如下
<property name="check" type="java.lang.String">
            <column name="Check" length="2" not-null="true" />
        </property>
想了一种办法,是修改 配置文件
<property name="check" type="java.lang.String">
            <column name="`Check`" length="2" not-null="true" />
        </property>
check 是关键字.  hibernate生成的 sql语句 对于列名是没有用`` 包括进去 ,在配置文件里 列名加上``即可.注意不是''!
当然,最好的办法是建表的时候不用数据库的关键字.
mysql 关键字
 

你可能感兴趣的:(oracle,sql,Hibernate,mysql,jdbc)