使用Hibernate / GORM的Grails java.sql.BatchUpdateException错误

时间:2013-07-15 16:33:00

标签: hibernate exception grails gorm grails-domain-class

我正在使用GORM为我将在多个Grails 2.2.3应用程序中使用的插件创建一些域类。出于某种原因,当我向学生域类添加一个Getter时,我收到一个BatchUpdateException,告诉我没有足够的权限进行更新。

编辑:请注意,我正在使用Oracle 11g数据库的ojdbc6-11.2.0.1.0驱动程序。

这是我的学生班:

class Student {

    String sid
    String firstName
    String lastName
    String middleInitial
    String email
    String ssn

    static mapping = {
        // Mappings and such
    }
}

我正在添加这个Getter来“清理”我从数据库收到的中间初始值,它是否为null:

String getMiddleInitial() {
    return this.middleInitial ?: ""
}

添加该行后,我导航到/$app_name/student/list URL并获取以下错误/堆栈跟踪:

Error 500: Internal Server Error

URI
/appname/employee/list
Class
java.sql.BatchUpdateException
Message
ORA-01031: insufficient privileges
Trace

   Line | Method
->> 895 | runTask in java.util.concurrent.ThreadPoolExecutor$Worker
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
|   918 | run     in     ''
^   680 | run . . in java.lang.Thread

Caused by SQLGrammarException: Could not execute JDBC batch update
->> 895 | runTask in java.util.concurrent.ThreadPoolExecutor$Worker
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
|   918 | run     in     ''
^   680 | run . . in java.lang.Thread

Caused by BatchUpdateException: ORA-01031: insufficient privileges

->> 10070 | executeBatch in oracle.jdbc.driver.OraclePreparedStatement
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
|   213 | executeBatch in oracle.jdbc.driver.OracleStatementWrapper
|   297 | executeBatch in org.apache.commons.dbcp.DelegatingStatement
|   895 | runTask in java.util.concurrent.ThreadPoolExecutor$Worker
|   918 | run . . in     ''
^   680 | run     in java.lang.Thread

删除Getter后,列出数据库中的所有学生都可以正常工作。这对我没有任何意义,因为它不像我正在尝试更新或将对象保存到数据库。任何人都可以解释发生了什么以及如何解决它?

2 个答案:

答案 0 :(得分:1)

检查dbCreateupdatecreate是否设置为DataSource.groovy

如果存在,则删除或注释掉该条目。

//dbCreate = 'update' //or use as below
dbCreate = 'none'

答案 1 :(得分:0)

在每100行之后刷新会话时我遇到了类似的问题。我打开了SQL日志记录和hibernate日志记录。事实证明,grails会话正在尝试持久化会话中不必要的域对象。在刷新会话之前,我不得不使用domainObj.discard()丢弃该对象。然后这个错误就消失了。