在Hibernate中插入或更新记录的正确方法是什么?

nue99wik  于 2023-10-23  发布在  其他
关注(0)|答案(1)|浏览(142)

一位同事使用以下在事务中运行的代码为一个实体实现了一个“插入或更新”函数。它应该更新现有的记录或创建它,如果它不存在。

EntityManager em = ...;

    public void saveMyEntity (MyEntity entity) {
        em.persist(em.contains(entity) ? entity : em.merge(entity));
    }

我认为这是错误的,原因有很多:

  • is正在做merge已经做的事情,检查实体是否存在
  • 如果em包含实体,则不需要持久化它
  • 如果在合并实体后调用persist也是无用的
  • 它不检查数据库中是否存在具有相同ID的实体
  • 如果它合并了实体,它应该返回合并后的实体

我相信下面的代码也能很好地工作,但是我还不太熟悉Hibernate,我可能会错过一些东西。

public MyEntity saveMyEntity (MyEntity entity) {
        return em.merge(entity);
    }

有人能证实我的分析吗?
我应该说明saveMyEntity函数的用途是将实体保存到DB中,该实体或者是使用Hibernate(使用em.createNativeQuery)检索并更新的,或者是在找不到实体时使用new MyEntity()创建的。

oxiaedzo

oxiaedzo1#

使用merge是正确的。当我们使用原生数据库“upsert”语法实现合并时,性能最终会变得更好,这与我们对https://hibernate.atlassian.net/browse/HHH-16727所做的类似

相关问题