有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

让我们使用以下实体和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图(简化)

enter image description here

对于初始发票文档创建,javers在实际发票文档中创建相关项目,作为独立的历史文档,具有初始版本类型,1作为版本。问题是,这些条目文档中的每一个都带有标有其数组索引位置的globalId_键。这个globalId_键不定期地标识每个项目文档。因此,如果将对发票进行更新,则将根据数组索引将发票中的项目与初始项目历史文档进行比较

请参考以下示例

假设在更新版本中,只有与发票相关的userName发生了更改,所有项目都被洗牌,没有任何项目更改,如下图所示

enter image description here

在本例中,javers将根据数组索引为具有全局ID_键的项创建3个单独的历史文档,如下所示

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

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

有没有可能避免贾维斯的这个问题,或者有没有其他选择


共 (1) 个答案