JaVers的java MongoDB文档版本更新问题
我用Javers用springboot进行mongoDB文档版本控制。它为版本控制提供了必要的功能,例如称为jv_snapshots
的单独历史记录集合、版本的Entity
或ValueObject
模型中的已更改字段列表。
但我发现了一个与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图(简化)
对于初始发票文档创建,javers在实际发票文档中创建相关项目,作为独立的历史文档,具有初始版本类型,1作为版本。问题是,这些条目文档中的每一个都带有标有其数组索引位置的globalId_键。这个globalId_键不定期地标识每个项目文档。因此,如果将对发票进行更新,则将根据数组索引将发票中的项目与初始项目历史文档进行比较
请参考以下示例
假设在更新版本中,只有与发票相关的userName
发生了更改,所有项目都被洗牌,没有任何项目更改,如下图所示
在本例中,javers将根据数组索引为具有全局ID_键的项创建3个单独的历史文档,如下所示
invoice/123#items/0
invoice/123#items/1
invoice/123#items/2
因此,在更新阶段,由于基于数组索引的比较,javers将再次为项目创建3个单独的历史文档。但这不应该发生,因为除了数组中的洗牌之外,条目不包含与初始版本的任何更改
有没有可能避免贾维斯的这个问题,或者有没有其他选择
# 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