我正在尝试将一条新记录插入到一张我知道手头独特的表格中。我已经尝试在对象上调用save(),但在执行任何INSERT之前会执行一堆SELECT语句,我不想这样做,因为我知道该对象已经是唯一的。
我正在为每个事务打开一个新会话,我可以看到这是一个问题,但这是我的域的约束。有没有办法强制Hibernate在INSERT之前不做任何SELECT?
答案 0 :(得分:8)
您可以使用persist()方法而不是save()。
https://forum.hibernate.org/viewtopic.php?f=1&t=1011405
但是,与save()不同,persist()不保证在持久化实例上立即设置标识符值。
答案 1 :(得分:2)
Hibernate正在尝试确定对象是否是瞬态的,所以在SELECT
之前执行INSERT
。您可以从Hibernate OneToOne mapping executes select statement before insert; not sure why调整此答案以避免SELECT
。
或者,我记得在论坛中有一篇关于覆盖hibernate在瞬态检查(以及乐观锁定)中使用的version
列的帖子。我找到它时会编辑这个答案。
答案 2 :(得分:1)
Hibernate不会发出select来查看某个对象在save()
上是否唯一。实际上,当您调用save()
时,Hibernate甚至不会发出插入内容。当您flush()
或提交交易时会发生这种情况。您需要确切了解选择的内容以及启动它们的内容。为了帮助缩小范围,您可以编写一个快速测试,如
Session session = openSession();
Transaction tx = session.beginTransaction();
session.save(myObject);
tx.commit();
并查看产生的陈述。