gpt4 book ai didi

oracle - Grails 3 Oracle AssertionFailure on Save 操作且未启用 getGenerateKeys 支持

转载 作者:行者123 更新时间:2023-12-02 14:44:17 24 4
gpt4 key购买 nike

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

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

配置

  • 环境:发展
  • 应用程序配置文件:网络
  • 应用版本:0.1
  • Grails 版本:3.0.1
  • Groovy 版本:2.4.3
  • JVM 版本:1.8.0_45(64 位)
  • 正在重新加载:true

可用 Controller :

  • phonebook.ListingController

操作系统:Windows 7数据库:Oracle 11g R2企业版(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:\Dev> grails create-app 电话簿
  • C:\Dev> cd 电话簿

编辑:build.gradle

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:\Dev\phonebook> grails create-domain-class Phonebook.listing编辑:grails-app\domain\phonebook\Listing.groovy

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/ 上运行时执行的操作互联网浏览器:http://localhost:8080/单击链接:可用 Controller > 电话簿.ListingController点击:新列表填写表格并单击:创建结果:上述 Grails 异常

研究和故障排除事件:

  • 不存在问题,只是将 Oracle 更改为 H2/HSQL 文件/内存数据库
  • 发现了 hibernate.jdbc.use_get_ generated_keys 设置,但未能成功通过在 application.yml 配置文件中设置 true 来解决问题
  • 在 grails-app/conf/DataSource.groovy 中发现多个对设置的引用,但这是使用 application.yml 的 Grails 3
  • 尝试在域类中使用多个属性来使用生成器映射 ID 列
  • 在 Grails 3 文档中几乎找不到涉及此主题的信息
  • Hibernate 文档涵盖配置设置和 ID 生成器,但不提供该信息的 Grails/Groovy 应用程序
  • Hibernate 文档指出,未显式设置 hibernate.jdbc.use_get_ generated_keys 会导致 jdbc 连接数据库元数据自动设置它

我尝试通过 grails-app\conf\application.yml 中的以下部分解决该问题:

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

我怀疑该解决方案涉及 grails-app\conf\application.yml 中的特定设置,但尚未发现正确的配置设置组合。

最佳答案

好吧,当研究 application.yml 配置文件中的位置以放置第一个答案中的建议时,我发现我使用的 hibernate.jdbc.use_get_ generated_keys = true 设置实际上位于 grails block 下。虽然以前从未使用过 yml 文件,但我没有意识到缩进和 block 如何形成配置设置的潜在重要性。当我第一次编辑文件时,我查看是否已经有一个 hibernate 部分,我将此设置放在该 block 中,从而导致 grails.hibernate.jdbc.use_get_ generated_keys 的设置。我在休眠的根目录(无缩进)下创建了设置并进行了测试。结果是成功完成了该操作。

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

关于oracle - Grails 3 Oracle AssertionFailure on Save 操作且未启用 getGenerateKeys 支持,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30743489/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com