-
Notifications
You must be signed in to change notification settings - Fork 472
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
3.0.2 object list dev #97
base: 3.0.2
Are you sure you want to change the base?
Conversation
应当提供给用户去支持多个字段的分组,比如下面的 @Data
public static class UserDO {
@DiffLogField(name = "用户ID")
private Long userId;
@DiffLogField(name = "用户姓名")
private String userName;
} |
@Test
@Sql(scripts = "/sql/clean.sql", executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD)
public void testCondition_对象数组修改() {
Order order = new Order();
order.setOrderId(99L);
order.setOrderNo("MT0000099");
order.setProductName("超值优惠红烧肉套餐");
order.addAuditor(1L,"张三");
Order order1 = new Order();
order1.setOrderId(99L);
order1.setOrderNo("MT0000099");
order1.setProductName("麻辣烫套餐");
order1.addAuditor(1L,"李四");
orderService.diff(order, order1);
List<LogRecord> logRecordList = logRecordService.queryLog(order.getOrderNo(), LogRecordType.ORDER);
Assert.assertEquals(1, logRecordList.size());
LogRecord logRecord = logRecordList.get(0);
System.out.println(logRecord.getAction());
Assert.assertEquals(logRecord.getAction(), "更新了订单审核人列表:List内部的数据更新如下: {[CompareId:{用户ID=1,}]: 【用户姓名】从【张三】修改为【李四】,}");
Assert.assertNotNull(logRecord.getExtra());
Assert.assertEquals(logRecord.getOperator(), "111");
Assert.assertEquals(logRecord.getBizNo(), order1.getOrderNo());
logRecordService.clean();
} 这里输出的action应该和前面的输出文档格式差不多。
这样给用户就是很乱的感觉。 |
在代码实现上是支持多个字段进行分组的 |
多个字段组合,就每个字段上都写上CompareId 就是支持多个字段组合的。 |
这块是可以讨论下的。 更新了订单审核人列表:List内部的数据更新如下: {[CompareId:{用户ID=1,}]: 【用户姓名】从【张三】修改为【李四】,} 这里面的 {[CompareId:{用户ID=1,}]: 是指定了修改了那个具体的对象, 后面是具体对象的更新内容,比如若是有多个对象都修改了会变成这样。 { |
/**
* 两个对象之间的比较是否相等
*/
protected boolean compare(Object source, Object target) {
if (!isContainsCompareId(source)) {
return source.equals(target);
}
Map<String, Object> sourceFieldValueMap = getCompareIdFieldValueMap(source);
Map<String, Object> targetFieldValueMap = getCompareIdFieldValueMap(target);
for (Map.Entry<String, Object> entry : sourceFieldValueMap.entrySet()) {
String key = entry.getKey();
Object value = entry.getValue();
if (!Objects.equals(value, targetFieldValueMap.get(key))) {
return false;
}
}
return true;
} 前面代码是没有依赖属性的hashcode和equals,在这里直接依赖比较想等,是否值得商榷。 存在的情况是,list中的值有可能也存在list对象。 |
一般来讲标识一个是否是同一个对象来讲, 一般不会说通过一个不确定的List 是否相等来标识同一个对象。多数情况是类似唯一主键来标识的 如 userId, orderNo 这种 |
list比较我想了一下,怎样我们框架为他们拼接key都是不妥的,因为key可能是一个 object对象,所以是不是可以定义一个接口,就类似于 public interface DiffUnique {
/**
* 输出list比对文案
*/
String docs();
/**
* 唯一ket的字段
*/
List<Field> key();
} 这样用户可控制,代码也好写。后面的就可以用单对象的diff方式 |
我其实想表达的是这里的比对可以依旧依赖底层的 |
意思是这个注解是可以写到 List 属性的上面, 来让用户自定义他的文案,和定义那个对象的标识之类的? |
|
这个判断对象是否是标识的同一个对象,我可能对‘java-object-diff` 用的比较少,所以就自己写了一套了,要是有的话用他会更好些。 它上面有这种类似的比较api吗? |
#94