java - 比较子实体列表时获取父实体 ID

标签 java javers

Javers v5.6.3

我有一个父实体,其中包含子实体列表。当我比较 2 个父级列表并且在子级中发现更改时,我需要知道哪个父级包含更改的子级。

我的实体:

@TypeName("Parent")
class Parent {
    @Id
    private String parentId;
    private Set<Child> children;
}

@TypeName("Child")
class Child {
    @Id
    private String childId;
    private String someProp;
}

我想要比较的内容:

为了简洁起见,切换到 Groovy:

def list1 = [
      new Parent(parentId:'p1', children: [new Child(childId: 'c1')]),
      new Parent(parentId:'p2', children: [new Child(childId: 'c2', someProp: 'fig')])
]
def list2 = [
      new Parent(parentId:'p1', children: [new Child(childId: 'c1', someProp: 'apple')]),
      new Parent(parentId:'p2', children: [new Child(childId: 'c2', someProp: 'fig')])
]

我如何比较:

Javers javers = JaversBuilder.javers()
                  .withListCompareAlgorithm(ListCompareAlgorithm.AS_SET)
                  .build();

Diff diff = javers.compareCollections(list1, list2);
System.out.println(diff);

输出:

Diff:
* changes on Child/c1 :
  - 'someProp' value changed from '' to 'apple'

我的问题:

如何发现哪个父级包含 Child/c1?

这类似于 shouldDetectSalaryChange() example除了我有一系列老板。以此为例,给定一份拥有不同下属的老板列表,如何找出伟大开发者的老板?

我是否需要创建自定义Parent比较器,或者有没有办法从内置比较器中查找?

最佳答案

有了这个映射,你就无法发现哪个Parent包含Child/c1,因为Child类被映射为Entity。所以 Javers 并不知道这种亲子关系。

您可以更改 Child 类到 ValueObject 的映射以使此关系明确:

    @TypeName("Parent")
    class Parent {
        @Id
        private String parentId
        private Set<Child> children
    }

    @TypeName("Child")
    class Child {
        private String childId
        private String someProp
    }

然后:

        Javers javers = JaversBuilder.javers()
                .withListCompareAlgorithm(ListCompareAlgorithm.AS_SET)
                .wi
                .build()

        Diff diff = javers.compareCollections(list1, list2, Parent)

        println(diff)

打印:

Diff:
* new object: Parent/p1#children/5f6ade8312fb0c5d60f756841e23af65
* object removed: Parent/p1#children/9de1d946eab394f971263c33e297f86d
* changes on Parent/p1 :
  - 'children' collection changes :
    . 'Parent/p1#children/9de1d946eab394f971263c33e297f86d' removed
    . 'Parent/p1#children/5f6ade8312fb0c5d60f756841e23af65' added

关于java - 比较子实体列表时获取父实体 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57649224/

相关文章:

java - 如果数据库已在使用中,如何使用当前状态初始化 Javers jv_snapshot?

java - 外部对象引用/多对象提交

java - 运行 Web 应用程序 - 错误 : package javax. faces.bean 不存在

java - 如何使用 Apache Beam 管理背压

java - 无法加载 7z-JBinding : no 7-Zip-JBinding in java. 库.path

java - SimpleJson : String to JSONArray

java - Javers - 在单个查询中跟踪子对象相对于父对象的更改

java - 如何使用树格式计算差异

java - 如何在单击按钮时从 JTextField 中删除 DocumentFilter 文本

java - 当属性为 null 时 Javers 抛出异常