当前位置: 首页 > 知识库问答 >
问题:

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

胥英奕
2023-03-14

Javers v5.6.3

我有一个父实体,其中包含一系列子实体。当我区分两个父母列表,发现一个孩子有变化时,我需要知道哪个父母包含变化的孩子。

我的实体:

@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'

我的问题是:

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

除了我有一个老板集合之外,这类似于应该检测薪酬变化()示例。使用该示例,给定具有不同下属的老板列表,如何找出Great Developer的老板?

我需要创建一个自定义的父比较器吗?或者有没有办法从内置比较器中找到答案?

共有1个答案

裴劲
2023-03-14

有了这个映射,您无法发现哪个父类包含子/c1,因为子类映射为实体。所以Javers不知道这种亲子关系。

您可以将儿童类的映射更改为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
 类似资料:
  • 我使用的是Spring数据jpa。将子实体添加到父实体后,我将父实体保存到数据库。我想得到孩子的身份证,但我发现我得到的是空的。 我在getId()方法中添加了@GeneratedValue(Strategy=GenerationType.IDENTITY),但它不起作用。 以下是模型: 父实体已经在数据库中,所以我直接找到它,父存储库entends Jpa列举 这里是我的测试代码: 我得到的输出

  • 我有两个实体与单向@OneTo多项映射: 我想获得所有B实体的列表,它们是匹配限制的A实体的子实体。 这就是我卡住的地方:c.list()将返回给我一个对象列表。我不关心A,我想要B。我如何使用Hibernate标准/预测来完成它?如果有关系,我使用Hibernate 4.2.12 在这种简化的情况下,只是急切地去拿是有意义的;在真实的例子中,有一个由四个一对一的单向关联组成的链,我想让所有(或者

  • 我将JPA2与Hibernate一起使用。有两个实体类,和。最后一个是第一个的继承实体。使用SINGLE_TABLE继承策略。当我尝试通过从id=“123456”的CardElement中查询

  • 删除父实体时,我还想删除关联的子实体(从数据库中)。我试图在删除时使用级联,如下所示,但我一定做错了什么。 当对父实体对象调用删除时,我收到错误消息:“该实体仍在数据库的其他地方引用”。我可以确认该实体在数据库的其他地方引用的唯一地方是在下面的两个表中(如果我手动从数据库中删除子行,对父实体对象的删除调用工作正常)。在过去的9个小时里,我一直在阅读实体对象并尝试不同的东西。我做错了什么? 这是我的

  • 我想通过在父实体上调用保存来将父实体和子实体一起保存到MySQL数据库中。父实体和子实体之间有一对一的映射。父ID是自动生成的,我们需要在子实体中使用与子实体相同的pk。 我使用的是Spring数据JPA2.0(JPA提供程序是Hibernate)和Spring MVC框架。当尝试插入实体时,我遇到以下错误。 根本原因 这是我的数据库模式: 以下是我的Java实体父实体: 儿童性: 这是我的主要方

  • 我很好奇,在JPA/Hibernate的父实体中,是否可能有几个相同实体的@manytone关系。 示例:我有银行交易,每笔交易都有一个银行合作伙伴,分别担任债权人和债务人。关键是,我只想编辑一次数据。昵称为“情妇”的银行合作伙伴只有一个:),无论是债权人还是债务人。一旦,它将重命名为妻子,所以我不想单独更改。此外,余额是BankPartners在这两个角色中的所有交易的总和。 @实体公共类事务{