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

Posted

技术标签:

【中文标题】让Oracle触发ID而不是Hibernate的序列?【英文标题】:Let Oracle trigger the sequence for ID instead of Hibernate? 【发布时间】:2012-02-22 19:46:01 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

【参考方案2】:

不能,在使用sequence support数据库和autonumber support数据库时有以下场景:

    序列支持

      Hibernate 获取序列的下一个值 Hibernate 将获取的值设置为您的实体的 ID Hibernate 持久化实体,其 ID 在查询中设置

    自动编号支持

      Hibernate 保持实体,没有 ID 值 Hibernate 从 JDBC 驱动程序获取分配的 ID

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

【讨论】:

我要提一下,使用 Hi-Lo 密钥生成器要好得多,因为 hibernate 对数据库的查询更少。

以上是关于让Oracle触发ID而不是Hibernate的序列?的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate + Oracle 创建自增序列ID

Hibernate在oracle中ID增长的方式

Hibernate在oracle中ID增长的方式(续)

如何让 Hibernate 在 Oracle 上将 SequenceHiLoGenerator 用于 JPA GenerationType.AUTO?

SQL而不是触发器有时不会触发?

如何让hibernate映射时字段区分大小写