【问题标题】:MongoDB document version update issue with JaVersJaVers 的 MongoDB 文档版本更新问题
【发布时间】:2021-10-27 02:29:54
【问题描述】:

我正在使用 Javers 进行带有 springboot 的 mongoDB 文档版本控制。它提供了版本控制的基本功能,例如称为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 项目历史文档进行比较索引

请参考以下示例。

假设只有与发票相关的 userNameUPDATE 版本中发生了变化,所有项目都被打乱,项目没有任何变化,如下图所示。

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

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

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

javers 是否有可能避免这个问题,或者有什么替代方法?

【问题讨论】:

    标签: java mongodb spring-boot javers document-versioning


    【解决方案1】:

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

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

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

    【讨论】:

    • 您能否提供任何资源链接,以使用您上面所说的这种方法在 javers 中实现列表算法和示例?
    • 我如何在 spring boot 中配置它?
    猜你喜欢
    • 2017-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-24
    • 1970-01-01
    • 1970-01-01
    • 2011-08-04
    相关资源
    最近更新 更多