【问题标题】:Grails java.sql.BatchUpdateException error using Hibernate/GORM使用 Hibernate/GORM 的 Grails java.sql.BatchUpdateException 错误
【发布时间】:2013-07-15 16:33:00
【问题描述】:

我正在使用 GORM 为我将在多个 Grails 2.2.3 应用程序中使用的插件创建一些域类。出于某种原因,当我将 Getter 添加到我的 Student 域类时,我收到 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 来“清理”我从数据库收到的中间初始值,因为它可能为空:

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 后,列出数据库中的所有学生就可以了。这对我来说没有任何意义,因为它不像我试图更新或保存对象到数据库。谁能解释发生了什么以及我该如何解决?

【问题讨论】:

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


    【解决方案1】:

    检查您是否在DataSource.groovy 中将dbCreate 设置为updatecreate

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

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

    【讨论】:

    • 我已将其删除,但我可以尝试将其显式设置为无。编辑:没有这样的运气。同样的错误。如果您想对设置/返回的内容进行一些额外控制,我认为 Grails 域类支持 Getter 和 Setter?
    • @grantmc 如果不使用dbCreate 应该是个问题。我使用了ojdbc14,并按照与上述相同的步骤解决了同样的问题。
    • @grantmc 你是在运行测试还是run-app?检查您是否在适当的环境下注释掉。
    • 我已将其从所有环境中删除。我正在做一个运行应用程序。似乎由于某种原因添加static transients = ['middleInitial'] 修复了它...
    • @grantmc 但这违背了目的。 middleInitial 是映射到 db 中的列的域类属性,不应是瞬态的。对吗?
    【解决方案2】:

    在每 100 行后刷新会话时,我遇到了类似的问题。我打开了 SQL 日志记录和休眠日志记录。原来是 grails 会话试图持久化会话中不必要的域对象。在刷新会话之前,我必须使用 domainObj.discard() 丢弃对象。然后这个错误消失了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-13
      • 2013-09-03
      • 1970-01-01
      • 2011-09-17
      • 2011-09-20
      • 1970-01-01
      相关资源
      最近更新 更多