【问题标题】:Force Hibernate Insert Without Select Statements在没有选择语句的情况下强制休眠插入
【发布时间】:2011-11-27 04:02:39
【问题描述】:

我正在尝试将一条新记录插入到我事先知道是唯一的表中。我尝试在对象上调用 save(),但是在执行任何 INSERT 之前会执行一堆 SELECT 语句,我不想​​这样做,因为我知道对象已经是唯一的。

我正在为每个事务打开一个新会话,我认为这是一个问题,但这是我的域的限制。有什么方法可以强制 Hibernate 在 INSERT 之前不执行任何 SELECT 吗?

【问题讨论】:

  • hibernate 会生成哪些 SELECT 语句?
  • 它为我域中的每个对象生成一个 SELECT,我不想这样做,因为我已经知道我的对象是全新的和独一无二的。

标签: java database hibernate jboss persistence


【解决方案1】:

您可以使用persist() 方法而不是save()。

https://forum.hibernate.org/viewtopic.php?f=1&t=1011405

但是,与 save() 不同,persist() 不保证标识符值会立即在持久化实例上设置。

https://forum.hibernate.org/viewtopic.php?f=1&t=951275

(你可以跳到 christian 的最后一篇帖子)

【讨论】:

    【解决方案2】:

    Hibernate 不会发出选择来查看对象在save() 上是否唯一。事实上,当您调用save() 时,Hibernate 甚至不会发出插入。当您flush() 或提交事务时,就会发生这种情况。您需要准确了解选择的用途以及启动它们的原因。为了帮助缩小范围,您可以编写一个快速测试,例如

    Session session = openSession();
    Transaction tx = session.beginTransaction();
    session.save(myObject);
    tx.commit();
    

    看看会产生什么语句。

    【讨论】:

      【解决方案3】:

      Hibernate 正在尝试确定对象是否是瞬态的,因此在 INSERT 之前执行 SELECT 也是如此。您也许可以从Hibernate OneToOne mapping executes select statement before insert; not sure why 调整此答案以避免SELECT

      或者,我记得在一个论坛上发表过关于覆盖 hibernate 在瞬态检查(以及乐观锁定)中使用的 version 列的帖子。当我找到它时,我会编辑这个答案。

      【讨论】:

        猜你喜欢
        • 2014-02-10
        • 1970-01-01
        • 1970-01-01
        • 2013-12-31
        • 1970-01-01
        • 2018-06-03
        • 1970-01-01
        • 2011-04-03
        • 1970-01-01
        相关资源
        最近更新 更多