jboss 强制Hibernate插入而不使用Select语句

but5z9lq  于 8个月前  发布在  其他
关注(0)|答案(4)|浏览(108)

我试图将一个新记录插入到一个表中,我知道这个表是唯一的。我试过在对象上调用保存(),但在执行任何SELECT之前,它会执行一堆SELECT语句,我不想这样做,因为我知道对象已经是唯一的。
我为每个事务打开一个新的会话,我可以看到这是一个问题,但这是我的域的约束。有没有什么方法可以强制Hibernate在关闭前不做任何SELECT操作?

fhg3lkii

fhg3lkii1#

可以使用persist()方法而不是保存()。
https://forum.hibernate.org/viewtopic.php?f=1&t=1011405
但是,与保存()不同,persist()不保证标识符值将立即在持久化示例上设置。
https://forum.hibernate.org/viewtopic.php?f=1&t=951275
(and你可以跳到基督教的最后一个帖子在线程)

tcbh2hod

tcbh2hod2#

Hibernate试图确定对象是否是 transient 的,所以在INSERT之前执行SELECT。你可能可以从Hibernate OneToOneMap中修改这个答案,在插入之前执行select语句;不知道为什么要避开SELECT
或者,我记得在一个论坛上有一篇关于重写hibernate在 transient 检查(和乐观锁定)中使用的version列的帖子。我会编辑这个答案当我找到它。

hpcdzsge

hpcdzsge3#

继承Persistable并重写isNew,如下所示:

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`
    ...
  }
  
  ...
}
i2byvkas

i2byvkas4#

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

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

看看会产生什么样的结果。

相关问题