MongoDB JaVers 的文档版本更新问题
MongoDB document version update issue with JaVers
我使用 Javers mongoDB 通过 springboot 进行文档版本控制。它为版本控制提供了基本功能,例如称为 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 项目历史文档进行比较在 数组索引 .
参考下面的例子。
假设在 UPDATE 版本中仅更改了与发票相关的 userName
,所有项目都被打乱,项目没有任何变化,如下图所示。
在这种情况下,javers将根据数组索引为具有globalId_keys的项目创建3个单独的历史文档。
invoice/123#items/0
invoice/123#items/1
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
我使用 Javers mongoDB 通过 springboot 进行文档版本控制。它为版本控制提供了基本功能,例如称为 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 项目历史文档进行比较在 数组索引 .
参考下面的例子。
假设在 UPDATE 版本中仅更改了与发票相关的 userName
,所有项目都被打乱,项目没有任何变化,如下图所示。
在这种情况下,javers将根据数组索引为具有globalId_keys的项目创建3个单独的历史文档。
invoice/123#items/0
invoice/123#items/1
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