如何使用java对象差异库来比较使用列表实现的一对多关系的对象图?
我想比较涉及各种集合的复杂对象图的“工作”和“基本”副本,并创建更改日志。从stackoverflow中,我注意到java对象diff库()可以为我工作。我已浏览了可用的文档/示例,但仍不清楚: 1.它如何比较收藏?如何使用java对象差异库来比较使用列表实现的一对多关系的对象图?,java,object,graph,compare,Java,Object,Graph,Compare,我想比较涉及各种集合的复杂对象图的“工作”和“基本”副本,并创建更改日志。从stackoverflow中,我注意到java对象diff库()可以为我工作。我已浏览了可用的文档/示例,但仍不清楚: 1.它如何比较收藏? 2.集合中项目的顺序是否相关? 3.如何将其配置为使用“equals”方法而不是内省? 例如,如果我有一个“用户”和“角色”对象。一个用户可以有许多角色。两者都使用其标识符重写“equals”方法。如何比较用户的不同副本及其各自的角色 集合通过使用其项的equals和hashC
2.集合中项目的顺序是否相关?
3.如何将其配置为使用“equals”方法而不是内省?
例如,如果我有一个“用户”和“角色”对象。一个用户可以有许多角色。两者都使用其标识符重写“equals”方法。如何比较用户的不同副本及其各自的角色
DiffNode
表示,并标记为未触及
,添加
,删除
或更改
。如果在base中找到一个项目(具有相同标识)并正在工作,则将检查该项目是否有更改,并将其标记为未触及
或已更改
。否则将分别标记为添加的或删除的。该库仍然缺少的一个功能是对集合中项目的排序和多次出现的支持。它基本上将所有集合类型视为Set
,只需检查对象是否存在。只要你不在乎订单,也不需要将一件物品多次放入同一个集合中,这应该不会是一个问题
@ObjectDiffEqualsOnlyType
注释类型,或者使用@ObjectDiffProperty(equalsOnly=true)
注释属性getter。如果不能使用注释,也可以通过使用配置的方法with equalsonlytype(最终类类型)
或with equalsonlyproperty(最终属性路径属性路径)
以编程方式进行。即将发布的版本将附带一个流畅的配置API,使这种配置更容易、更强大
关于您的示例:假设您将两个版本的
用户
传递给对象different
,java对象diff将返回一个节点(根节点),表示用户
。只要不将用户类标记为equals only类型,就可以根据每个属性对其进行比较。每个属性最终都将作为根节点的子节点。现在让我们假设其中一个属性是角色的列表
:库将对存在于基本版本和工作版本中的项目(已知项目)、仅存在于基本版本中的项目(已删除)和仅存在于工作版本中的项目(已添加)进行分组。这可以通过使用基础集合的contains
方法或通过equals
直接比较项目来实现。然后将检查“已知”项是否有更改。这可以是一个简单的调用equals
或通过内省进行深入比较;取决于给定类型的配置方式。我的回答对您有帮助吗?