当前位置: 首页 > 知识库问答 >
问题:

Grails 3 Oracle AssertionFailure on Save action with getGeneratedKeys支持未启用

桂阳文
2023-03-14

问题:错误500:内部服务器错误

URI: /listing/save
Class: org.hibernate.AssertionFailure
Message: getGeneratedKeys() support is not enabled

配置

  • 环境:发展
  • 应用配置文件:web
  • 应用版本:0.1
  • Grails版本:3.0.1
  • Groovy版本:2.4.3
  • JVM版本:1.8.0_45(64位)
  • 重新加载活动:true

可用控制器:

  • 电话簿。列表控制器

操作系统:Windows 7数据库:Oracle 11g R2 Enterprise Edition(11.2.0.4 64位)

调试输出包含:

Grails application running at http://localhost:8080
ERROR org.hibernate.AssertionFailure - HHH000099: an assertion failure occured (this may indicate a bug in Hibernate, but is more likely due to unsafe use of the session):     org.hibernate.AssertionFailure: getGeneratedKeys() support is not enabled
ERROR org.grails.web.errors.GrailsExceptionResolver - AssertionFailure occurred when processing request: [POST] /listing/save - parameters:
name: Scott
phone: 555-1212
create: Create
getGeneratedKeys() support is not enabled. Stacktrace follows:
org.hibernate.AssertionFailure: getGeneratedKeys() support is not enabled
    at phonebook.ListingController.$tt__save(ListingController.groovy:38) ~[main/:na]
    at grails.transaction.GrailsTransactionTemplate$2.doInTransaction(GrailsTransactionTemplate.groovy:93) ~[grails-core-3.0.1.jar:3.0.1]
    at grails.transaction.GrailsTransactionTemplate.execute(GrailsTransactionTemplate.groovy:90) ~[grails-core-3.0.1.jar:3.0.1]
    at grails.transaction.GrailsTransactionTemplate$2.doInTransaction(GrailsTransactionTemplate.groovy:93) ~[grails-core-3.0.1.jar:3.0.1]
    at grails.transaction.GrailsTransactionTemplate.execute(GrailsTransactionTemplate.groovy:90) ~[grails-core-3.0.1.jar:3.0.1]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) ~[na:1.8.0_45]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) ~[na:1.8.0_45]
    at java.lang.Thread.run(Thread.java:745) [na:1.8.0_45]

File: grails-app\controllers\phonebook\ListingController
Line: 38
Content:         listing.save flush:true

复制问题:

  • C:\开发

编辑:生成。格拉德尔

dependencies {
  ...
  runtime "com.oracle:jdbc-lib-ojdbc6:11.2.0.4"
  ...
}

注意:Oracle客户端ojdbc6。jar在上面指定的坐标处添加到本地Maven存储库。

编辑:grails-app\conf\application.yml

...
dataSource:
    pooled: true
    jmxExport: true
    driverClassName: oracle.jdbc.OracleDriver
    username: scott
    password: tiger

environments:
    development:
        dataSource:
            dbCreate: update
            url: jdbc:oracle:thin:@localhost:1521/sbx1
...

C: \开发人员\电话簿

package phonebook

class Listing {
    String name
    String phone

    static constraints = {
        name maxSize: 50
        phone maxSize: 14
    }
}

C:\Dev\phonebook> grails generate-all phonebook.listing
C:\Dev\phonebook> grails run-app

以下内容确认应用程序连接到数据库并成功创建表:

SQL> describe listing
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 ID                                        NOT NULL NUMBER(19)
 VERSION                                   NOT NULL NUMBER(19)
 NAME                                      NOT NULL VARCHAR2(50 CHAR)
 PHONE                                     NOT NULL VARCHAR2(14 CHAR)

模式中还创建了两个序列:

HIBERNATE_SEQUENCE
LISTING_SEQ

注意:这些必须是我多次尝试修改域类中的映射属性以生成ID时创建的。

嵌入式Tomcat服务器运行后的操作http://localhost:8080/Internet Explorer:http://localhost:8080/单击链接:可用控制器

研究和故障排除活动:

  • 不存在的问题是唯一的更改是Oracle到H2/HSQL文件/内存数据库
  • 发现hibernate。jdbc。use\u get\u生成的\u密钥设置,但通过在应用程序中放置true设置,未能解决问题。yml配置文件
  • 在grails-app/conf/DataSource中找到多个对设置的引用。groovy,但这是使用应用程序的Grails 3。yml
  • 尝试在域类中使用生成器映射ID列的多个属性
  • 在Grails 3文档中几乎没有关于这个主题的信息
  • Hibernate文档涵盖了配置设置和ID生成器,但没有提供该信息的Grails/Groovy应用程序
  • Hibernate文档说明没有明确设置Hibernate。jdbc。use\u get\u生成的\u键导致它由jdbc连接数据库元数据自动设置

我试图通过grails app\conf\application中的以下部分来解决这个问题。yml:

hibernate:
    jdbc:
        use_get_generated_keys: true
    cache:
        queries: false
...

我怀疑解析涉及grails app\conf\application中的特定设置。但尚未发现配置设置的正确组合。

共有3个答案

常飞翼
2023-03-14

Oracle 12的这个问题通过添加

   jdbc:
      use_get_generated_keys: true

并将oracle jdbc驱动程序升级到ojdbc7 12.1.0.2(12.1.0.1不起作用)

公孙胡媚
2023-03-14

您还可以尝试从标识序列生成器(我相信是Oracle方言的默认值)切换到seq hilo:

在Grails 2中。x、 您可以通过:

grails.gorm.default.mapping = {
    id generator: 'seqhilo', params: [max_lo: 1000]
}

我假设它在3中也会起到类似的作用。应用程序中的x。yml文件。这应该可以防止hibernate甚至不需要使用getGeneratedKeys()方法,因为它会将id从自己的内存池绑定到插入中,而不是执行seq。insert语句中的nextval。

萧永望
2023-03-14

好的,当我查看application.yml配置文件中的位置以放置第一个答案中的建议时,我发现我使用的hibernate.jdbc.use_get_generated_keys=true设置实际上在grails块下。虽然以前从未使用yml文件,但我不知道缩进和块如何形成配置设置的潜在重要性。当我第一次对文件进行编辑时,我查看是否已经有一个Hibernate部分,我将此设置放在该块中,从而产生grails.hibernate.jdbc.use_get_generated_keys的设置。我在Hibernate的根(无缩进)下创建了设置并进行了测试。结果是成功完成了操作。

我希望这篇文章能帮助其他新用户使用这个配置文件,它在以groovy为中心的框架中似乎不合适。我将看看在创建新的grails应用程序时是否有一个选项来利用groovy配置文件而不是yml文件。

 类似资料:
  • 我试图在Spring Boot应用程序中启用CORS支持,但没有成功。我研究了很多解决方案,但似乎都不适合我。 当我尝试从Angular应用程序呼叫Java后端时,我在chrome中看到了错误: CORS策略阻止从源http://localhost:4200在http://localhost:8080/..处访问XMLHttpRequest:对预检请求的响应不通过权限改造检查:不允许对预检请求进行

  • 我正在尝试使用NetBeans(或任何IDE)开发JavaFX应用程序,但我无法正确安装JDK和JavaFX。 对于上下文,我使用Ubuntu 18.04 LTS,并遵循本指南。目前,当运行时,我得到以下输出: 这不是我想要使用的JDK。我已经从这个网站下载了JDK15,打开了tar。gz文件,并将其放入名为的文件夹中的。提取文件夹后,我将JDK添加到我的系统路径变量中: 然后是系统重启。在Net

  • 当我在Django项目中设置React时,我遇到了这个错误 模块生成失败(来自./node_modules/babel-loader/lib/index.js):语法错误:C:\users\1sun\cebula3\cebula_react\assets\js\index.js:当前未启用对实验语法“class properties”的支持(17:9): 所以,我安装了@babel/plugin-

  • 我使用spring-boot-starter-data-solr,并希望利用Spring Data Solr的schmea cration支持,如文档中所述: 每当刷新应用程序上下文时,自动架构填充都会检查您的域类型,并根据属性配置将新字段填充到索引中。这要求 solr 在无架构模式下运行。 但是,我无法实现这一目标。据我所知,Spring启动器不会在@EnableSolrRepositories

  • 问题内容: Visual Studio 2017中是否有一种方法可以自动为asp.net核心 Angular 项目启用Docker支持?创建新选项时,该选项被禁用。它仅适用于 Web应用程序(MVC) 。 创建项目后,我可以为角度项目启用Docker支持(项目->添加-> Docker支持),但是当我启动应用程序时,出现一个异常,提示node.js不可用。 发生System.AggregateEx