gpt4 book ai didi

java - Javers 是否可以比较两个包含 valueObjects 的 Sets,使用 equals/hashcode 方法来识别它们以检测更改?

转载 作者:行者123 更新时间:2023-12-02 04:15:44 27 4
gpt4 key购买 nike

Javers 可以比较两个集合来识别旧集合中每个对应对象在新集合中的对象中发生的变化吗?

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

请提出建议。

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

这是我的测试用例:

Javers javers = JaversBuilder.javers().build();
SetConMap oldMap = new SetConMap();
Set<Contact> oldSysCons = new HashSet<>();
oldMap.setSysCons(oldSysCons);
oldSysCons.add(new Contact().sysCode("AL").localId("123").goldenId("ABC"));
oldSysCons.add(new Contact().sysCode("AL").localId("456").goldenId("ABC"));

SetConMap newMap = new SetConMap();
Set<Contact> 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(oldMap, newMap);
System.out.println(diff);
private static class Contact {
private String sysCode;
private String localId;
private String goldenId;
//getters, setters.
@Override
public int hashCode() {
return super.hashCode();
}

@Override
public boolean equals(Object obj) {
return obj != null && (obj instanceof Contact) && Objects.equals(sysCode, ((Contact) obj).getSysCode())
&& Objects.equals(localId, ((Contact) obj).getLocalId());
}
}

差异:

* 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

最佳答案

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

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

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

关于java - Javers 是否可以比较两个包含 valueObjects 的 Sets,使用 equals/hashcode 方法来识别它们以检测更改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56661340/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com