在没有选择语句的情况下强制休眠插入

Posted

技术标签:

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

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

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

【问题讨论】:

hibernate 会生成哪些 SELECT 语句? 它为我域中的每个对象生成一个 SELECT,我不想这样做,因为我已经知道我的对象是全新的和独一无二的。 【参考方案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 列的帖子。当我找到它时,我会编辑这个答案。

【讨论】:

以上是关于在没有选择语句的情况下强制休眠插入的主要内容,如果未能解决你的问题,请参考以下文章

在 selectInput() 中强制没有默认选择

休眠条件:在没有映射关联的情况下加入表

在几个选择查询或插入查询后休眠挂起

休眠选择查询不返回任何内容

MySQL:按顺序插入选择

有没有办法在不使用多个 SELECT 语句的情况下选择与选中项关联的元素?