如何在Javers中审计List字段本身但禁用其元素审计?
Javers MongoDB审计:追踪List字段但禁用元素级审计
问题背景
我正在使用Javers为MongoDB实体做版本控制和审计追踪,遇到性能问题:当Document包含List类型字段时,Javers会为列表内每个元素生成独立快照,导致调用findShadows时要为每个List元素执行后续查询,大幅拖慢影子数据的获取速度。
我需要只追踪List字段本身的变化(比如列表增删、整体替换),但禁用对列表内每个元素对象的审计(比如Task的taskDescription变更)。试过@DiffIgnore但会忽略整个List字段,不符合需求。
实体示例代码
class Employee { private String name; private Double age; private List<Task> tasks; // getter、setter等 } class Task { private String taskName; private String taskDescription; private String taskId; // getter、setter等 }
解决方案
方法1:为Task类添加@ValueObject注解
Javers默认会将复杂对象视为实体(Entity)追踪内部变化,把Task标记为值对象后,Javers会将整个Task作为不可分割的单元处理,不会追踪其内部字段的变更,只会在Task对象整体替换、列表增删时记录tasks字段的变化。
修改后的Task类:
import org.javers.core.metamodel.annotation.ValueObject; @ValueObject class Task { private String taskName; private String taskDescription; private String taskId; // getter、setter等 }
这种配置下,Javers不会为每个Task生成独立快照,能有效减少findShadows的查询次数,同时保留对tasks列表整体变化的审计。
方法2:通过Javers全局配置指定Task为值对象
如果不想修改Task类的代码,可以在Javers初始化时,通过全局配置将Task指定为值对象:
Javers javers = JaversBuilder.javers() .registerValueType(Task.class) .build();
该方式和@ValueObject注解效果完全一致,同样会让Javers把Task当作不可分割的单元处理,只追踪List整体变化,不审计Task内部字段。
注意事项
- 值对象没有独立ID,Javers通过字段内容全量比对判断变化。如果Task内部字段修改,Javers会将其视为全新的Task对象,在List中记录为元素替换(这符合需求:只追踪List变化,不关心Task内部修改细节)。
- 若后续需要单独审计Task实体,请勿使用上述两种方式,需根据业务场景调整配置。
内容的提问来源于stack exchange,提问作者Satyam Bansal
相关产品推荐
相关产品推荐

