这是一个后续问题,用于检索给定修订版本的审计实体名称,旧值和新值
我已经弄清楚了如何获得实体的两个修订版,但是很难找到两者之间的区别。envers中有什么可以帮助对不同修订版本的实体进行比较?还是任何好的图书馆?
如果可以修改属性(_mod)字段字段,我将非常酷。
因此,我想使生活更轻松的是创建一个注释,以标记我有兴趣比较的字段。没有,我最终不得不坚持命名对话,就像仅使用以’get’开头的方法一样。我发现这种方法有很多极端的情况。
注释。
@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) public @interface AuditCompare { public String name() default ""; public CompareType compareBy() default CompareType.string; enum CompareType { string, count } }
像这样被使用
@Entity @Audited public class Guideline { ..... @AuditCompare private String name; @AuditCompare private String owner; @OneToMany(cascade = CascadeType.ALL, orphanRemoval=true, mappedBy="guideline") private Set<GuidelineCheckListItem> checkListItems = new HashSet<GuidelineCheckListItem>(); ......... }
由于envers将Set更改和Set的对象都审核为两个不同的事件,因此我不想比较是否更改了set。然后做比较,我有看起来像的方法
private void findMatchingValues(Object oldInstance, Object newInstance, ActivityEntry entry) { try { Class oldClass = oldInstance.getClass(); for (Field someField : oldClass.getDeclaredFields()) { if (someField.isAnnotationPresent(AuditCompare.class)) { String name = someField.getAnnotation(AuditCompare.class).name(); name = name.equals("") ? someField.getName() : name; Method method = oldClass.getDeclaredMethod(getGetterName(name)); if(someField.getAnnotation(AuditCompare.class).compareBy().equals(AuditCompare.CompareType.count)) { int oldSize = getCollectionCount(oldInstance, method); int newSize = getCollectionCount(newInstance, method); if (oldSize != newSize) entry.addChangeEntry(name, oldSize, newSize); } else { Object oldValue = getObjectValue(oldInstance, method); Object newValue = getObjectValue(newInstance, method); if (!oldValue.equals(newValue)) entry.addChangeEntry(name, oldValue, newValue); } } } } catch (NoSuchMethodException e) { throw new RuntimeException(e); } }