public class MyEntity implements Persistable<KeyType> {
@Id
private KeyType id;
@Transient
private boolean isNew = false; // this tells next `save()` usually to do `UPDATE to DB`
public KeyType getId() {
return id;
}
public boolean isNew() {
return isNew;
}
// constructor when you create new Entity assigning 100% new unique id:
public MyEntity(String id) {
this.id = id;
this.isNew = true; // this tells next `save()` to do `INSERT INTO DB`
...
}
...
}
4条答案
按热度按时间fhg3lkii1#
可以使用persist()方法而不是保存()。
https://forum.hibernate.org/viewtopic.php?f=1&t=1011405
但是,与保存()不同,persist()不保证标识符值将立即在持久化示例上设置。
https://forum.hibernate.org/viewtopic.php?f=1&t=951275
(and你可以跳到基督教的最后一个帖子在线程)
tcbh2hod2#
Hibernate试图确定对象是否是 transient 的,所以在
INSERT
之前执行SELECT
。你可能可以从Hibernate OneToOneMap中修改这个答案,在插入之前执行select语句;不知道为什么要避开SELECT
。或者,我记得在一个论坛上有一篇关于重写hibernate在 transient 检查(和乐观锁定)中使用的
version
列的帖子。我会编辑这个答案当我找到它。hpcdzsge3#
继承Persistable并重写isNew,如下所示:
i2byvkas4#
Hibernate不会发出select命令来查看对象在
save()
上是否唯一。事实上,当你调用save()
时,Hibernate甚至不会发出一个插入。当你flush()
或提交事务时,就会发生这种情况。您需要准确地找出选择的目的以及启动它们的原因。为了帮助缩小范围,您可以编写一个快速测试,看看会产生什么样的结果。