【问题标题】:Hibernate JPA Column "NEXTVAL" not found未找到休眠 JPA 列“NEXTVAL”
【发布时间】:2014-09-27 20:30:02
【问题描述】:

我们将 JPA 提供程序从 EclipseLink 更改为 Hibernate 4.1.3。尝试使用生成的 ID 持久化实体时出现问题。这会产生以下错误:

    JdbcSQLException: Column "NEXTVAL" not found; SQL statement: select nextval for SCHEMA.ID_SEQ_GENERATOR

实体的顺序如下所示:

    @Id
    @SequenceGenerator(name = "ID_GENERATOR", initialValue = 100000, allocationSize = 1, sequenceName = "ID_SEQ_GENERATOR")
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "ID_GENERATOR")
    @Column(name = "ID", nullable = false)
    public Long getId() {
      return this.id;
    }

我尝试更改“策略 = GenerationType.IDENTITY”,但没有效果。

有什么建议吗?

【问题讨论】:

  • 你在哪个数据库上? JPA 提供者是你唯一改变的东西吗(你为什么改变它)?
  • 它是 DB2。该软件相当大,它的其他部分已经在使用 Hibernate。此“子软件”已更改为使用 Hibernate,以与其他部分保持一致。
  • 设置了错误的方言?

标签: java hibernate jpa


【解决方案1】:

我发现根据使用的环境使用不同的数据库。使用的方言(当前)总是相同的,即使它应该根据执行代码的服务器而改变。 (正确的方言实际上是首先加载的,但是由于 spring 决定使用另一个用 @Configuration 注释的类,所以它被替换了。我认为使用配置文件应该让我克服这个问题,尽管仍然使用这个......)

我发现这个链接帮助我走上正轨: http://techmagik.blogspot.fi/2012/07/sequence-support-in-jpa-for-db2-zos.html.html

发现用的是H2,我把SQL改成:

"NEXT VALUE FOR " + sequenceName
  • 修复了错误

因此,实际问题在于加载正确的方言(正如“Luca Basso Ricci”所暗示的那样)。方言适用于 DB2(始终),而在某些情况下应该适用于 H2。出于某种原因,当提供者更改时,这个问题就出现了,因此很难找到正确的原因。

【讨论】: