让Oracle触发ID序列而不是Hibernate?

让Oracle触发ID序列而不是Hibernate?,hibernate,grails,Hibernate,Grails,我有一个应用程序,它有一个Oracle数据库,其中每个表都有一个触发器,该触发器调用一个序列来获取该行的下一个ID。如何配置域,使Hibernate不指定插入的下一个ID,而只让Oracle和触发器处理它 以前,我的域设置为使用序列生成器,这似乎是可行的。我不能在我们的生产系统上使用它,因为DBA不允许我为Grails序列授予select特权。这显然破坏了Hibernate的生成器。您不能,当使用序列支持数据库和自动编号支持数据库时,会出现以下情况: 序列支持 Hibernate获取序列的下一个

我有一个应用程序,它有一个Oracle数据库,其中每个表都有一个触发器,该触发器调用一个序列来获取该行的下一个ID。如何配置域,使Hibernate不指定插入的下一个ID,而只让Oracle和触发器处理它


以前,我的域设置为使用序列生成器,这似乎是可行的。我不能在我们的生产系统上使用它,因为DBA不允许我为Grails序列授予select特权。这显然破坏了Hibernate的生成器。

您不能,当使用序列支持数据库和自动编号支持数据库时,会出现以下情况:

  • 序列支持

  • Hibernate获取序列的下一个值
  • Hibernate将获取的值设置为实体的ID
  • Hibernate保存实体,并在查询中设置其ID
  • 自动编号支持

  • Hibernate保留实体,不带ID值
  • Hibernate从JDBC驱动程序获取分配的ID

  • 事实上,Oracle的驱动程序不支持步骤2.2,因此Hibernate无法检索最后分配的ID(因此它可以在实体的ID中设置它)。

    您不能,当使用序列支持数据库和自动编号支持数据库时,会出现以下情况:

  • 序列支持

  • Hibernate获取序列的下一个值
  • Hibernate将获取的值设置为实体的ID
  • Hibernate保存实体,并在查询中设置其ID
  • 自动编号支持

  • Hibernate保留实体,不带ID值
  • Hibernate从JDBC驱动程序获取分配的ID

  • 事实上,Oracle的驱动程序不支持步骤2.2,因此Hibernate无法检索最后分配的ID(因此它可以在实体的ID中设置它)。

    有一个Hibernate论坛主题,它讨论了一个自定义生成器,它使用JDBC插入中的
    生成键来检索
    ID

    如果该自定义生成器适用于您,您应该能够通过以下方式使用它:

    static mapping = {
        id generator:"jpl.hibernate.util.TriggerAssignedIdentityGenerator"
    }
    

    有一个Hibernate论坛主题,它讨论了一个自定义生成器,它使用JDBC插件中的
    generatedKeys
    检索
    id

    如果该自定义生成器适用于您,您应该能够通过以下方式使用它:

    static mapping = {
        id generator:"jpl.hibernate.util.TriggerAssignedIdentityGenerator"
    }
    

    我将提到使用Hi-Lo键生成器更好,因为hibernate查询数据库的次数更少。我将提到使用Hi-Lo键生成器更好,因为hibernate查询数据库的次数更少。