You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Javers中如何查看NewObject变更关联属性及对象图完整路径?

关于Javers框架的两个问题解答

1. 查看NewObject类型变更指向的具体属性

NewObject类型的变更本质上代表整个对象被新增到对象图中,它不像PropertyChange那样直接关联单个属性,但你可以通过以下方式获取新对象的属性信息:

  • 首先通过change.getAffectedGlobalId()拿到新对象的全局ID;
  • 利用Javers的快照查询API加载该对象的完整数据,比如:
    List<Snapshot> snapshots = javers.findSnapshots(Query.byGlobalId(change.getAffectedGlobalId()));
    if (!snapshots.isEmpty()) {
        // 从快照中获取对象的所有属性和值
        Map<String, Object> properties = snapshots.get(0).getState();
        // 遍历处理属性
        properties.forEach((key, value) -> System.out.println("属性:" + key + ",值:" + value));
    }
    
  • 如果你是在ChangeProcessor的实现类中,也可以直接通过Javers实例查询新对象的当前状态(如果对象仍在内存中)。

2. 获取新对象在对象图中的完整路径

当然可以!默认的全局ID只显示类型和实例标识,但Javers的GlobalId其实包含了对象的层级关系信息,你可以通过递归遍历GlobalId的owner信息来拼接出完整路径:

实现思路:

每个嵌套对象(比如你提到的Address)的GlobalId如果是ValueObjectId类型,会包含ownerId(父对象的全局ID)和propertyName(父对象中指向该嵌套对象的属性名)。通过递归向上追溯owner,就能拼接出从顶层对象到当前对象的完整路径。

示例代码:

public class CustomChangeProcessor implements ChangeProcessor {
    private Javers javers;

    public CustomChangeProcessor(Javers javers) {
        this.javers = javers;
    }

    @Override
    public void onNewObject(NewObject change) {
        GlobalId globalId = change.getAffectedGlobalId();
        String fullPath = buildFullPath(globalId);
        System.out.println("新对象的完整路径:" + fullPath);
    }

    private String buildFullPath(GlobalId globalId) {
        // 处理顶层实体对象(InstanceId类型)
        if (globalId instanceof InstanceId) {
            InstanceId instanceId = (InstanceId) globalId;
            return instanceId.getTypeName() + "/" + instanceId.getValue();
        }
        // 处理嵌套值对象(ValueObjectId类型)
        if (globalId instanceof ValueObjectId) {
            ValueObjectId voId = (ValueObjectId) globalId;
            // 递归拼接父路径 + 当前属性名
            return buildFullPath(voId.getOwnerId()) + "." + voId.getPropertyName();
        }
        // 其他类型的GlobalId直接返回其字符串表示
        return globalId.value();
    }

    // 实现其他ChangeProcessor方法...
}

这样处理后,你就能得到类似User/123.homeAddress或User/123.workAddress的完整路径,轻松区分两个Address对象了。

内容的提问来源于stack exchange,提问作者Stef

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:54:21