MongoDB JaVers 的文档版本更新问题

MongoDB document version update issue with JaVers

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

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

Invoice.java

@TypeName("invoice")
public class Invoice {

    @Id
    private long invoiceId;

    private String userName;

    private String userId;

    private List<ItemModel> items;
}

ItemModel.java

public class ItemModel {

    private String itemNo;

    private String description;

    private String brandId;

    private String packId;
}

ER 图(简体)

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

参考下面的例子。

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

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

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

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

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

如果您不关心顺序,请将模型中的 List 更改为 Set。或者,您可以将 Javers 配置为使用 ListCompareAlgorithm.AS_SET 功能。

在 Spring 引导中,您可以通过在 application.yml 中设置 javers.algorithm: AS_SET 来启用它。

https://javers.org/documentation/spring-boot-integration/#javers-configuration-properties