【发布时间】:2021-10-27 02:29:54
【问题描述】:
我正在使用 Javers 进行带有 springboot 的 mongoDB 文档版本控制。它提供了版本控制的基本功能,例如称为jv_snapshots 的单独历史集合、Entity 或ValueObject 模型中的更改字段列表。
但我发现了一个与 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 项目历史文档进行比较索引。
请参考以下示例。
假设只有与发票相关的 userName 在 UPDATE 版本中发生了变化,所有项目都被打乱,项目没有任何变化,如下图所示。
在这种情况下,javers 将根据数组索引为具有 globalId_keys 的项目创建 3 个单独的历史文档,如下所示。
invoice/123#items/0invoice/123#items/1invoice/123#items/2
因此,在更新阶段,由于基于数组索引的比较,javers 将再次为项目创建 3 个单独的历史文档。但这不应该发生,因为项目不包含与初始版本相比的任何更改,除了数组内部的改组。
javers 是否有可能避免这个问题,或者有什么替代方法?
【问题讨论】:
标签: java mongodb spring-boot javers document-versioning