当前位置: 首页 > 面试题库 >

使用Hibernate Envers在两个版本之间获取旧值和新值

叶景龙
2023-03-14
问题内容

这是一个后续问题,用于检索给定修订版本的审计实体名称,旧值和新值

我已经弄清楚了如何获得实体的两个修订版,但是很难找到两者之间的区别。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);
    }
}


 类似资料:
  • 我在树状图中有数据,我使用ObservableList来渲染地图数据。我需要直接在TableView上编辑字符串值。问题是,如何更改TreeMap上的真实数据,即如何从数据列表中获取旧的和新的str值以将其放入map键中。 getOldValue方法不起作用。我用这个方法得到的只是新值。

  • 我有Python 3.6。5和Python 3.7。4.已安装。 给我3.6,而 给我3.7。PyCharm中的运行代码表明它仍在使用3.6。如何更新它以开始使用3.7和/或删除3.6? 我环顾了很多其他论坛,但到目前为止,似乎没有什么与这个具体问题相关。

  • 我想在eclipse中为两个不同的项目使用两个版本的ant插件。这两个版本都可以在我的Eclipse的plugins文件夹中找到。但是,当我试图将ant插件添加到清单中的插件依赖项中时,我只能看到最新版本的ant插件。MF文件。请帮我做这个。

  • 我有两个具有多列的数据帧。 我想比较df1['id']和df2['id'],并返回一个新的df,其中列['correct_id']具有匹配值。例子: df1: df2 这是我的代码: 我得到的结果是: 预期输出: 我该怎么解决这个问题拜托

  • 问题内容: 我试图从所有内容都在一个列中的地址中提取状态,这是一个示例: 我一直在尝试找出如何使用和一起做,但是我似乎无法掌握。这是我到目前为止的内容: 我以为它会从第二个逗号开始,到第三个逗号结束,并且让我的所有内容介于两者之间,但事实并非如此。 任何帮助表示赞赏。 问题答案: 一般来说, 例子: