让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 上将 SequenceHiLoGenerator 用于 JPA GenerationType.AUTO?