问题标签 [document-versioning]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
112 浏览

java - JaVers 的 MongoDB 文档版本更新问题

我正在使用 Javers 进行带有 springboot 的 mongoDB 文档版本控制。它提供了版本控制的基本功能,例如单独的历史集合称为jv_snapshots、更改的字段列表EntityValueObject版本的模型。但我发现了一个与 valueObjects 相关的问题,但与实体无关。如您所知,entity 和 valueObjects 之间的区别在于标识实体的唯一 id,而 valueObjects 没有这样的 Id 来标识它们的版本。当我在我的用例中观察到这个问题时,请参考以下示例。

让我们采用以下 Entity 和 valueObject 模型进行版本控制。

发票.java

项目模型.java

ER图(简化)

在此处输入图像描述

对于初始发票文档创建,javers 在实际发票文档中创建相关项目作为具有INITIAL版本类型和 1 作为版本的单独历史文档。问题是这些项目文档中的每一个都带有标有其数组索引位置的globalId_key 。globalId_key 唯一地标识每个项目文档。因此,如果发票将发生UPDATE ,则其中的项目将根据数组 index与INITIAL项目历史文档进行比较。

请参考以下示例。

假设在UPDATEuserName版本中仅更改了与发票相关的所有项目,所有项目都被打乱,项目没有任何变化,如下图所示。

在此处输入图像描述

在这种情况下,javers 将根据数组索引为具有globalId_keys的项目创建 3 个单独的历史文档,如下所示。

  1. invoice/123#items/0
  2. invoice/123#items/1
  3. invoice/123#items/2

因此,在更新阶段,由于基于数组索引的比较,javers 将再次为项目创建 3 个单独的历史文档。但这不应该发生,因为项目不包含与初始版本相比的任何更改,除了数组内部的改组。

有没有可能避免javers的这个问题,或者有没有其他选择?