在没有选择语句的情况下强制休眠插入
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
列的帖子。当我找到它时,我会编辑这个答案。
【讨论】:
以上是关于在没有选择语句的情况下强制休眠插入的主要内容,如果未能解决你的问题,请参考以下文章