一位同事使用以下在事务中运行的代码为一个实体实现了一个“插入或更新”函数。它应该更新现有的记录或创建它,如果它不存在。
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()
创建的。
1条答案
按热度按时间oxiaedzo1#
使用
merge
是正确的。当我们使用原生数据库“upsert”语法实现合并时,性能最终会变得更好,这与我们对https://hibernate.atlassian.net/browse/HHH-16727所做的类似