【问题标题】:Record Map Changes with JaVers使用 JaVers 记录地图更改
【发布时间】:2017-12-08 15:11:04
【问题描述】:

是否可以使用 JaVers 记录对 Map 中值的更改?

我想将所有更改(添加、更新和删除)记录到我的 RecordStore 对象中,以便对所发生的事情进行审计跟踪。目前,我正在使用以下代码,并在每次更改后提交。

private Map<String, Record> records = new HashMap<>();
private Javers history = JaversBuilder.javers().build();

public RecordStore(){
    history.commit("user", records);
}

public void addRecord(Record a){
    records.put(a.getId(), a);
    history.commit("user", records);
}
public void removeRecord(Record a){
    records.remove(a.getId());
    history.commit("user", records);
}
public void updateRecord(Record a){
    records.put(a.getId(), a);
    history.commit("user", records);
}

public String printHistory(){
    List<Change> changes = history.findChanges(QueryBuilder.anyDomainObject().build());
    return history.processChangeList(changes, new SimpleTextChangeLog());
}

但是,JaVers (printHistory()) 生成的更改列表中只有 EntryAdded 和 EntryRemoved 记录。更糟糕的是,它在整个日志中使用更改的值,而不是仅在更改之后使用。我以前没有使用过 JaVers,所以如果能帮助它按需要工作,我将不胜感激。下面是一个使用 RecordStore 的测试类:

public static void main(String[] args){
    RecordStore store = new RecordStore();

    Record a1 = new Record();
    a1.setStart(0);
    a1.setEnd(5);
    a1.setValue("James");
    store.addRecord(a1);

    Record a2 = new Record();
    a2.setStart(10);
    a2.setEnd(15);
    a2.setValue("Jimmy");
    store.addRecord(a2);

    Record a3 = new Record();
    a3.setStart(20);
    a3.setEnd(25);
    a3.setValue("Jimbo");
    store.addRecord(a3);

    a2.setValue("JIMMY");
    store.updateRecord(a2);

    store.removeRecord(a1);

    System.out.println(store.printHistory());
}

【问题讨论】:

  • 一种可能的解决方案是扩展 HashMap 并创建自己的 Map。创建一个列表来存储您要跟踪的更改。覆盖您要跟踪的方法并将值添加到 List。然后调用超级方法。
  • Record 类有什么?你是怎么映射的? (我的意思是哪个 JaversType)
  • Record 类是一个简单的类,具有 startendvalue 属性 - 我没有向它添加任何 JaVers 特定信息。
  • 所以 JaVers 将其映射为 ValueObject 类型。

标签: java javers


【解决方案1】:

通常,您会一个一个地提交域对象,例如:

public void addRecord(Record a){
    records.put(a.getId(), a);
    history.commit("user", a);
}
public void removeRecord(Record a){
    records.remove(a.getId());
    history.commitShallowDelete("user", a);
}
public void updateRecord(Record a){
    records.put(a.getId(), a);
    history.commit("user", a); 
}

但是,记录应该映射为实体类型(使用@Id)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-08
    • 2016-04-21
    • 2013-02-25
    • 2018-11-12
    • 1970-01-01
    • 1970-01-01
    • 2019-05-21
    • 2021-10-15
    相关资源
    最近更新 更多