在 Hibernate 6.0 中,
saveOrUpdate(entity)
方法现已弃用。 Javadoc 建议将其替换为 merge()
或 persist()
。
但是这样做会破坏我的一些测试,“具有相同标识符值的不同对象已与会话关联”(合并)或“唯一索引或主键冲突”(持续)。
如何正确替换我的
saveOrUpdate()
电话?
我已经弄清楚了(感谢您的提示,Mar-Z!)。
if (Objects.isNull(session.find(MyEntity.class, entity.getId()))) {
session.persist(entity);
} else {
session.merge(entity);
}
首先通过 ID 从数据库加载实体并检查它是否返回。如果没有返回任何内容
persist()
将其作为新实体插入数据库,否则现有条目将由 merge()
更新。
但是这样做会破坏我的一些测试,“具有相同标识符值的不同对象已与会话关联”(合并)
这至少有点出乎意料,因为此错误通常不会从 merge()
发生。但是您需要发布(简化的)代码和
最重要的是堆栈跟踪,才能希望我们能够帮助您解决问题。
或“唯一索引或主键违规”(持续)。这听起来很正常。
如何正确替换我的通常,您可以将其替换为对
saveOrUpdate()
电话?
merge()
的调用。但请注意,
merge()
确实具有不同的语义,因此它肯定不是直接替代品。
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);
}
}