Hibernate的sessionFactory在合并后覆盖initialState实体

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

我在一个项目中使用Springboot和Hibernate,我正在做PATCH请求。长话短说,我引用了一个更新:

hibernateEntityAccess.update(original, patchedData, OperationTarget.ENTITY);

这是调用的更新:

@SyncChs
    @Transactional(rollbackFor = Exception.class)
    public void update(final Auditable<?> initialState, final Auditable<?> finalState, final OperationTarget target, final boolean isInternalOperation) throws IOException {
        int key = operation.getCurrentSession().setInitial(initialState, (AuditableEntity) initialState, target, isInternalOperation);
        Auditable<?> merged = (Auditable<?>) sessionFactory.getCurrentSession().merge(finalState);
        operation.getCurrentSession().setFinal(key, merged, (AuditableEntity) finalState, isInternalOperation);
    }

.merge(finalState)之后,original中的数据被patchedData中的数据覆盖。我已经让我的实体可克隆,并尝试了这个

hibernateEntityAccess.update(original.clone(), patchedData.clone(), OperationTarget.ENTITY);

查看original变量是否不会被合并覆盖,但会发生相同的行为。
有人知道为什么会这样吗?

6gpjuf90

6gpjuf901#

我使用.toBuilder().build()解决了这个问题:

hibernateEntityAccess.update(original.toBuilder().build(), patchedData.toBuilder().build(), OperationTarget.ENTITY);

这样我的原始变量就不会改变。

相关问题