Java Javers能否比较两个包含ValueObject的集合,用equals/hashcode方法识别它们以检测更改?

Java Javers能否比较两个包含ValueObject的集合,用equals/hashcode方法识别它们以检测更改?,java,javers,Java,Javers,Javers能否比较两个集合,以识别新集合中的对象对旧集合中每个对应对象所发生的更改 实现是否依赖于value对象类的equals方法?我为我的值对象实现了equals方法,但它似乎仍然将它们视为不同的对象。 如果它不使用equals方法,我们可以这样做吗?因为,Java集合本身依赖于equals方法来确保集合中不存在重复项 请建议 在下面的测试用例中,我使用sysCode和localId作为对象的组合标识符,不包括goldenId。 但是diff(类下的输出)没有识别出相等的对象,并将diff

Javers能否比较两个集合,以识别新集合中的对象对旧集合中每个对应对象所发生的更改

实现是否依赖于value对象类的equals方法?我为我的值对象实现了equals方法,但它似乎仍然将它们视为不同的对象。 如果它不使用equals方法,我们可以这样做吗?因为,Java集合本身依赖于equals方法来确保集合中不存在重复项

请建议

在下面的测试用例中,我使用sysCode和localId作为对象的组合标识符,不包括goldenId。 但是diff(类下的输出)没有识别出相等的对象,并将diff显示为旧集合中的所有对象(已删除)和新se中的对象(已添加),这似乎没有增加任何值

以下是我的测试用例:

Javers-Javers=JaversBuilder.Javers().build();
SetConMap oldMap=新SetConMap();
Set oldSysCons=newhashset();
oldMap.setSysCons(oldSysCons);
添加(新联系人().sysCode(“AL”).localId(“123”).goldenId(“ABC”));
新增(新联系人().sysCode(“AL”).localId(“456”).goldenId(“ABC”));
SetConMap newMap=新SetConMap();
Set newSysCons=new HashSet();
newMap.setSysCons(newSysCons);
newSysCons.add(new Contact().sysCode(“AL”).localId(“123”).goldenId(“DEF”));
newSysCons.add(new Contact().sysCode(“AL”).localId(“456”).goldenId(“DEF”));
newSysCons.add(new Contact().sysCode(“AL”).localId(“789”).goldenId(“DEF”));
Diff-Diff=javers.compare(旧地图、新地图);
系统输出打印项次(差异);
私有静态类联系人{
私有字符串系统码;
私有字符串本地化;
私人字符串goldenId;
//能手,二传手。
@凌驾
公共int hashCode(){
返回super.hashCode();
}
@凌驾
公共布尔等于(对象obj){
返回obj!=null&&(obj instanceof Contact)&&Objects.equals(sysCode,((Contact)obj.getSysCode())
&&Objects.equals(localId,((Contact)obj.getLocalId());
}
}
差异:


Javers将Contact类视为一个值对象:在本例中,它执行逐个属性的比较(请参阅)

要获得更详细的比较结果,您可以在Contact类的一个属性上使用@Id注释将其转换为实体


另一种解决方案可能是编写自定义比较器(但我从未尝试过)。

Javers将Contact类视为一个值对象:在这种情况下,它执行逐个属性的比较(请参阅)

要获得更详细的比较结果,您可以在Contact类的一个属性上使用@Id注释将其转换为实体


另一个解决方案可能是编写一个自定义比较器(但我从未尝试过)。

但是,有了它,我们将无法检测到Contact对象发生的任何更改,例如本例中的GoldenId,因为我们将@DiffIgnore添加到除对象标识符之外的所有属性中。我的理解是goldenId的更改并不有趣,因为它没有在equals()方法中使用。如果您对goldenId更改感兴趣,为什么Javers的默认行为不适合您的用例(逐个属性比较)?您能描述一下您希望从示例代码中获得的输出以获得更清晰的概念吗?我希望输出是这样的:changes:contact-with-syscode:AL,localId;123::将goldenId从ABC更改为DEF,,,与系统代码联系:AL,localId;456::将goldenId从ABC更改为DEF,,,增加了与syscode:AL的联系,本地化ID:789与goldenId:DEFoh的联系,我了解需求。这种比较不适用于值对象,而适用于实体。如果您在Contact类的localId属性上添加@Id注释,您可能会获得您所期望的结果(假设将该字段用作标识属性是有意义的),但是,有了它,我们将无法检测Contact对象发生的任何更改,例如本例中的GoldenId,因为我们将@DiffIgnore添加到除对象标识符之外的所有属性中。我的理解是goldenId的更改并不有趣,因为它没有在equals()方法中使用。如果您对goldenId更改感兴趣,为什么Javers的默认行为不适合您的用例(逐个属性比较)?您能描述一下您希望从示例代码中获得的输出以获得更清晰的概念吗?我希望输出是这样的:changes:contact-with-syscode:AL,localId;123::将goldenId从ABC更改为DEF,,,与系统代码联系:AL,localId;456::将goldenId从ABC更改为DEF,,,增加了与syscode:AL的联系,本地化ID:789与goldenId:DEFoh的联系,我了解需求。这种比较不适用于值对象,而适用于实体。如果在Contact类的localId属性上添加@Id注释,则可能会获得预期的结果(假设将该字段用作标识属性是有意义的)
* new object: org.ishafoundation.cdi.web.rest.GoldenContactResource$SetConMap/#sysCons/c76fadcd55d4dbf6d8cbe49310b1ab26
* new object: org.ishafoundation.cdi.web.rest.GoldenContactResource$SetConMap/#sysCons/96b23b34a0f42a5105491350db5c46f1
* new object: org.ishafoundation.cdi.web.rest.GoldenContactResource$SetConMap/#sysCons/a9c7f46bbe5f0e46b5751f3f5c5d8542
* object removed: org.ishafoundation.cdi.web.rest.GoldenContactResource$SetConMap/#sysCons/a53e4ba1b22c4f290a80daf40adf5d81
* object removed: org.ishafoundation.cdi.web.rest.GoldenContactResource$SetConMap/#sysCons/782edf187b8add9bab004ca06f7b6c7c
* changes on org.ishafoundation.cdi.web.rest.GoldenContactResource$SetConMap/ :
  - 'sysCons' collection changes :
    . 'org.ishafoundation.cdi.web.rest.GoldenContactResource$SetConMap/#sysCons/782edf187b8add9bab004ca06f7b6c7c' removed
    . 'org.ishafoundation.cdi.web.rest.GoldenContactResource$SetConMap/#sysCons/a53e4ba1b22c4f290a80daf40adf5d81' removed
    . 'org.ishafoundation.cdi.web.rest.GoldenContactResource$SetConMap/#sysCons/a9c7f46bbe5f0e46b5751f3f5c5d8542' added
    . 'org.ishafoundation.cdi.web.rest.GoldenContactResource$SetConMap/#sysCons/c76fadcd55d4dbf6d8cbe49310b1ab26' added
    . 'org.ishafoundation.cdi.web.rest.GoldenContactResource$SetConMap/#sysCons/96b23b34a0f42a5105491350db5c46f1' added