【问题标题】:Hibernate ID Generation with Sequence in Oracle - Single trip to DB在 Oracle 中使用序列生成休眠 ID - 单次访问数据库
【发布时间】:2013-06-12 08:27:54
【问题描述】:

在hibernate中,当sequence作为插入的生成策略时,它首先从序列中查询DB获取下一个值,然后在实体中设置它。之后,该实体将持久保存在 db 中。所以总结一下,执行了两个查询。

流程:

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

查询:

select CUSTOM_SEQUENCE.nextval from dual

然后在插入语句中使用这个值。

问题:

无论如何,我们可以在休眠中生成类似INSERT INTO foobar (foo_id, foo) VALUES (FOOBAR_SEQUENCE.nextval, 'bar'); 的查询吗?

【问题讨论】:

    标签: java oracle hibernate


    【解决方案1】:

    作为替代方案,您可以使用 Hibernate seqhilo generator,这将通过请求更大的序列并在内部处理 ID 来避免往返数据库。

    【讨论】:

    • hi/lo 策略在集群环境中或在多个应用程序可以同时更新数据库表的场景中是否安全?
    • 是的,因为 Hibernate 正在向 Oracle 保留序列范围。
    • 根据您的回答和休眠文档,Hilo 确实避免往返 DB。有没有什么方法可以像我在问题中提到的那样使用查询在数据库端生成 id,这将把大部分工作留在数据库端,我认为 db 可以非常有效地处理。虽然我可以使用 hilo,但这种策略很少有陷阱,例如 hibernate.atlassian.net/browse/HHH-3608
    • 如果我仔细选择我的低值和高值,Hilo 似乎是最佳策略。如果这些值将来发生变化,则可能会导致冲突。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-16
    • 2016-05-29
    • 1970-01-01
    • 1970-01-01
    • 2015-10-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多