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

时间:2012-02-22 19:46:01

标签: hibernate grails

我有一个具有Oracle数据库的应用程序,其中每个表都有一个触发器,该触发器调用序列以获取该行的下一个ID。如何配置我的域,以便Hibernate不在插入上指定下一个ID,只让Oracle和触发器处理它?<​​/ p>

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

2 个答案:

答案 0 :(得分:5)

有一个Hibernate论坛主题,它讨论了一个自定义生成器,它使用JDBC插入中的generatedKeys来检索idhttps://forum.hibernate.org/viewtopic.php?t=973262

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

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

答案 1 :(得分:0)

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

  1. 序列支持

    1. Hibernate获取序列的下一个值
    2. Hibernate将获取的值设置为您实体的ID
    3. Hibernate持久化实体,并在查询中设置ID
  2. 自动编号支持

    1. Hibernate持久化实体,没有ID值
    2. Hibernate从JDBC驱动程序中提取已分配的ID
  3. 事实上,Oracle的驱动程序不支持步骤2.2,因此Hibernate无法检索最后分配的ID(因此它可以将其设置为您实体的ID)。