SpringBoot集成JaVers做MongoDB版本控制时值对象数组排序导致冗余问题咨询
解决方案
原生JaVers配置方案
方案1:全局修改列表比对算法
JaVers默认使用基于索引的LEVENSHTEIN_DISTANCE算法比对List元素,这是导致排序变更触发值对象快照生成的核心原因。你可以全局修改比对算法为忽略顺序的AS_SET模式,SpringBoot配置如下:
javers: listCompareAlgorithm: AS_SET
开启后所有List类型的比对都会忽略元素顺序,仅当元素内容发生变更时才会生成新快照,排序调整不会触发快照生成。
方案2:为值对象指定业务唯一标识(更推荐)
如果不需要全局修改List比对规则,可以给ItemModel的业务唯一字段添加JaVers的@Id注解,JaVers会用该字段作为值对象全局ID的组成部分,替代默认的数组索引。示例代码如下:
public class ItemModel { @org.javers.core.metamodel.annotation.Id private String itemNo; private String description; private String brandId; private String packId; }
该方案仅对ItemModel生效,不会影响其他业务模型的List比对逻辑,适配性更强。
替代方案
如果以上原生配置不符合你的业务场景,可以选择以下实现方案:
- 将
ItemModel改为独立的MongoDB实体,单独维护自身的文档ID,Invoice中仅存储关联的Item ID列表,此时ItemModel会被JaVers识别为独立Entity,排序调整仅会变更Invoice的ID列表顺序,不会触发Item本身的快照生成。 - 自定义JaVers的
CommitListener实现类,在快照提交前比对ItemModel的前后版本内容,内容完全一致的快照直接过滤,不写入历史集合。
内容的提问来源于stack exchange,提问作者Kavindu Vindika
相关产品推荐
相关产品推荐

