【问题标题】:autogenerated keys for grails 2.4.3grails 2.4.3 的自动生成键
【发布时间】:2014-09-08 09:42:21
【问题描述】:

问题已解决。问题是我使用了jdbc3。使用jdbc4解决问题!

我已从 grails 2.3.6 升级到 grails 2.4.3。 这意味着从休眠 3.6.10.3 更改为休眠 3.6.10.17。 我使用带有序列的 postgresql 数据库为所有对象生成 id:

CREATE SEQUENCE hibernate_sequence;

CREATE TABLE betygstyp (
    id bigint PRIMARY KEY DEFAULT nextval('hibernate_sequence'),
...

我希望不必更改以前运行良好的数据库(使用 grails 2.3.6 等)

当我现在尝试保存新对象时,我收到以下错误消息:

org.postgresql.util.PSQLException:不支持返回自动生成的密钥。 在
org.postgresql.jdbc3.AbstractJdbc3Connection.prepareStatement(AbstractJdbc3Connection.java:448)

我也用 hibernate 4.3.5.5 尝试过这个,它给出了同样的问题。

我怀疑需要一些新的配置,但是什么? 我使用 Grails 中使用的默认配置,不使用任何 xml 配置进行休眠。

【问题讨论】:

  • 您是否尝试使用bigserial 而不是nextval 的默认值?
  • 如果您解决了问题(通过升级到最新的驱动程序),请将其添加为答案并接受该答案。
  • 顺便说一句:它一定不仅仅是从 jdbc3 升级到 jdbc4:getGeneratedKeys() 在 postgresql-8.4-702.jdbc4.jar、postgresql-8.4-703.jdbc3.jar postgresql- 中工作正常9.3-1102.jdbc3.jar 和 postgresql-9.3-1102.jdbc4.jar

标签: hibernate postgresql grails


【解决方案1】:

Hibernate 可能已经改变了绕过 postgresql 缺点的策略。 postgresql JDBC3驱动不支持自动重新发送序列生成的id。 如果策略改为使用标准 SQL

insert into betygstyp (...) values (...) returning id

然后升级到最新版本的 JDBC4 驱动程序可能会解决这个问题。事实上,我从与 @inge 的直接接触中知道确实如此。

【讨论】:

  • "postgres 不支持自动重新发送序列生成的 id" - 这根本不是真的。使用 prepareStatement("...", Statement.RETURN_GENERATED_KEYS) 时,getGeneratedKeys() 在 Postgres 中工作得很好
  • 对不起,你是对的,我应该改写为“postgresql JDBC3驱动程序中不支持...
  • 我也可以使用postgresql-8.4-703.jdbc3.jar
  • 对我来说既不是 postgresql-jdbc3-9.1.jar 也不是 postgresql-9.3-1102.jdbc3.jar 和 java-7-openjdk-amd64 或 java-8-oracle 但在我的带有 postgresql-jdbc3-9.1.jar 和 java-6-openjdk 的旧服务器可以正常工作。应用程序是基于 Grails 和 Groovy 构建的,我认为调整 Hibernate 没有任何意义,因此我允许 Hibernate 自动生成所有查询。
  • 那么这似乎是 Hibernate/Grails/Groovy 的错误,而不是 JDBC 驱动程序的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-28
  • 1970-01-01
  • 2014-11-24
  • 1970-01-01
  • 2010-12-21
  • 2015-07-01
  • 1970-01-01
相关资源
最近更新 更多