0

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

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

发票.java

@TypeName("invoice")
public class Invoice {

    @Id
    private long invoiceId;

    private String userName;

    private String userId;

    private List<ItemModel> items;
}

项目模型.java

public class ItemModel {

    private String itemNo;

    private String description;

    private String brandId;

    private String packId;
}

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的这个问题,或者有没有其他选择?

4

1 回答 1

1

如果您不关心订购,ListSet在模型中更改。或者,您可以配置 Javers 以使用该ListCompareAlgorithm.AS_SET功能。

在 Spring Boot 中,您可以通过javers.algorithm: AS_SETapplication.yml.

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

于 2021-08-27T13:11:24.907 回答