【问题标题】:Why does hibernate do the SELECT before SAVE?为什么休眠在 SAVE 之前执行 SELECT?
【发布时间】:2012-04-24 18:26:58
【问题描述】:

为什么hibernate会在保存对象之前进行选择?

我在互联网上找不到有用的信息。这是每次保存之前的正常行为吗?我找到了这个主题,select Query Run for hibernateTemplate.save() - 保存,但我没有找到这个“确定的”答案。我的意思是,如果我想在保存每个对象之前避免此选择,我们是否必须使用版本控制?

我将不胜感激所有的解释或链接。

【问题讨论】:

  • 您是如何在映射中添加版本列的?请提供来源。
  • @cherouvim:我添加了该列以防止这种选择。这就是:
  • 你能显示部分选择语句吗?
  • 您使用哪个版本的 Hibernate?你确定你打电话给save(),而不是saveOrUpdate()?另外,添加版本控制后select 消失了吗?
  • @cherouvim @axtavt 感谢您的回复!我的坏我的坏,我有一个具有分配IDS的子对象,我将它们添加到父对象,然后保存父对象,所以在保存之前,休眠必须选择这个孩子,因为它不知道他们是否是是否在数据库中,因为他们的 ID :/ 谢谢你的帮助。 (我现在该如何回答这个问题?:))

标签: hibernate optimization


【解决方案1】:

所以 Julia 是对的,使用分配了 ID 的实体调用 Session.save() 会导致休眠执行 SELECT,然后是 INSERT。幸运的是,有两种解决方法:

  • 不要预先分配您的 ID(对我来说不是一个选项)
  • 请致电Session.persist() 而不是Session.save()

第二个选项也可以与 Envers 无缝协作。

希望这可以节省其他人的狩猎时间。

【讨论】:

  • 是的,分配的 IDS 选择肯定会发生(并且确实有意义),但是我的 id 是自动生成的……无论如何,问题已经解决。但我现在将谷歌搜索 session.persist() 做了什么,因为我从未使用过它。谢谢
  • 非常感谢!节省了我数小时的搜索时间以优化批量保存。
【解决方案2】:

我知道您已经在问题的评论中回答了您自己的问题,但在这里总结一下是一些一般性的观点。

澄清一下,NHibernate 在“SQL INSERT”中使用“保存”,在“SQL UPDATE”中使用“更新”。

我知道 NHibernate 会在持久化之前从数据库中隐式获取对象(不显式使用 s.Update)的这些常见场景:

  1. 在映射中 select-before-update 设置为“true”时,在 session_flush/transaction_commit(取决于设置)上;
  2. 当使用 SaveOrUpdate 并且实例的标识符具有表明它存在于数据库中的值时;
  3. 在 s.Delete 之前。

与您的示例一样,当使用父子对象时,这可能并不明显(但简单的规则保持不变),因为从代码中获取子对象可能并不明显。

【讨论】:

    【解决方案3】:

    不,它不会在保存之前进行选择。您确定您的编辑保存用例是正确的吗? webapps 的一个常见流程是:

    • 用户对 /products/5/edit 的点击次数 (GET)
    • 服务器将 Product#5 提取到 http 会话中
    • 服务器返回用于编辑产品#5的html表单
    • 用户提交 (POST) 表单
    • 服务器从 http 会话中获取 Product#5
    • 服务器根据请求填充它
    • 服务器将填充的 Product#5 合并回休眠

    将执行一个同时处理版本控制的 sql 更新。如果版本号不同步,则会抛出StaleObjectStateException

    【讨论】:

    • 嗨,谢谢你的回答。我清楚地看到它发生在保存之前。所以,我只是创建新对象,然后在 dao 中执行 getHibernateTemplate.save(object)。他确实选择过,我在日志中看到。我看不出与更新混淆的原因:/
    • 好吧,我很困惑,因为你提到了版本控制。
    • 好吧,我添加了一个版本列,因为我在 hibernate 论坛上读到,他们说为了避免在保存之前选择这个,应该添加版本列,以便 hibernate 知道对象是瞬态的还是不,然后他不做选择。但我还是不明白,如果我打电话给 SAVE,为什么他必须这样做。
    猜你喜欢
    • 2017-01-22
    • 1970-01-01
    • 1970-01-01
    • 2016-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 2018-12-05
    相关资源
    最近更新 更多