如何替换 Hibernate 6 中已弃用的 saveOrUpdate() 方法?

问题描述 投票:0回答:3

在 Hibernate 6.0 中,

saveOrUpdate(entity)
方法现已弃用。 Javadoc 建议将其替换为
merge()
persist()

但是这样做会破坏我的一些测试,“具有相同标识符值的不同对象已与会话关联”(合并)或“唯一索引或主键冲突”(持续)。

如何正确替换我的

saveOrUpdate()
电话?

java hibernate hibernate-6.x
3个回答
1
投票

我已经弄清楚了(感谢您的提示,Mar-Z!)。

if (Objects.isNull(session.find(MyEntity.class, entity.getId()))) {
    session.persist(entity);
} else {
    session.merge(entity);
}

首先通过 ID 从数据库加载实体并检查它是否返回。如果没有返回任何内容

persist()
将其作为新实体插入数据库,否则现有条目将由
merge()
更新。


0
投票

但是这样做会破坏我的一些测试,“具有相同标识符值的不同对象已与会话关联”(合并)

这至少有点出乎意料,因为此错误通常不会从 merge()

 发生。

但是您需要发布(简化的)代码和

最重要的是堆栈跟踪,才能希望我们能够帮助您解决问题。

或“唯一索引或主键违规”(持续)。

这听起来很正常。

如何正确替换我的

saveOrUpdate()

 电话?

通常,您可以将其替换为对

merge()

 的调用。但请注意,
merge()
确实具有不同的语义,因此它肯定不是直接替代品。


0
投票
我正在使用这样的解决方案:

public void saveOrUpdate(Object entity) { SessionImplementor sessionImplementor = entityManager.unwrap(SessionImplementor.class); EntityEntry entry = sessionImplementor.getPersistenceContext().getEntry(entity); EntityState state = EntityState.getEntityState(entity, null, entry, sessionImplementor, true); if (this.entityManager.contains(entity) || state == EntityState.DETACHED) { this.entityManager.merge(entity); } else { this.entityManager.persist(entity); } }
    
© www.soinside.com 2019 - 2024. All rights reserved.