java - 如何有效地比较同一类的两个对象并检查哪些是不同的字段?
问题描述
我想编写一个通用函数,它接受同一实体类的两个对象并比较不同的字段并返回对特定字段所做的所有更改的列表以及时间。
众多实体类中的一个会说 Member 如下
public class Member {
String firstName;
String lastName;
String driverLicenseNumber;
Integer age;
LocalDateTime timestamp;
}
在数据库中,我有一个名为 member_audit 的表,只要使用触发器在成员表中发生更改(对于其他实体也是如此),它就会填充旧数据。
我将返回的每个实体的资源列表类似于
public class MemberAuditsResource {
private String field;
private LocalDateTime on;
private String changeType;
private String oldValue;
private String newValue;
}
我只能想像这样分别为每个实体编写一个函数
private List<MembeAuditsResource> memberCompare(Member obj1, Member obj2) {
//Compare every field in both the objects using if else and populate the resource.
}
然后调用上面的函数来比较 entity_audit 表中的每一对记录。代码将非常大,无法比较每个字段并乘以不同的实体。有没有更好更有效的方法?
解决方案
如果你扩展思想来比较对象图,这不是一个小问题。因此,有效的方法不是重新发明轮子,而是使用现有的库,例如JaVers:
Member oldMember = new Member("foo" ,"chan" ,"AB12" , 21 ,LocalDateTime.now());
Member newMember = new Member("bar" ,"chan" ,"AB12" , 22 ,LocalDateTime.now());
Diff diff = javers.compare(oldMember, newMember);
for(Change change: diff.getChanges()) {
System.out.println(change);
}
然后,你可以得到类似的东西:
ValueChange{ 'firstName' changed from 'foo' to 'bar' }
ValueChange{ 'age' changed from '21' to '22' }
推荐阅读
- asp.net - 如何使 Web 应用程序使用其实际路径,而不是临时 ASP.NET 路径
- html - 内容覆盖了我的页脚 - 想要一个固定或最大高度
- list - Prolog 返回空列表,递归谓词的基本情况问题
- java - 可以在 !.isTerminated 循环中添加 Thread.sleep 吗?
- python - 如何使用 Boto3 和 Python 将多个批处理消息从列表发送到 SQS 队列
- python - 如何在 Django API 中显示结果
- css - Flex box 项目位置自定义排序
- python - 运行标签传播算法后在 Graphframe 上绘制 python-igraph
- sql - 以特定长度和特定字符打破sql查询中的字符串
- unity3d - 如何从 Unity Packages 安装 PSD Importer?