0

我们目前使用的是 JaVers 3.0.0。假设我们有以下两个实体 A 和 B。A 跟踪列表中的一些 B。

@Entity
@TypeName("A")
public class A {

    @Id
    private int id;
    private List<B> items;

    public A() {
        items = new ArrayList<>();
    }

    public A(int id) {
        this();
        this.id = id;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public List<B> getItems() {
        return items;
    }

    public void setItems(List<B> items) {
        this.items = items;
    }

}

这是我们相当简单的 B 类。

@Entity
@TypeName("B")
public class B {

    @Id
    private int id;

    public B() {
    }

    public B(int id) {
        this.id = id;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

}

让我们对 A 类型的对象提交三个更改:

  • 提交具有空列表的对象
  • 提交带有两个添加 B 的对象
  • 移除一个 B 提交对象

之后我想观察B的变化。

Javers javers = JaversBuilder
                .javers()
                .build();

A a = new A(1);
javers.commit("foo@example.com", a);

a.getItems().add(new B(1));
a.getItems().add(new B(2));
javers.commit("foo@example.com", a);

a.getItems().remove(0);
javers.commit("foo@example.com", a);

List<Change> changes = javers.findChanges(
QueryBuilder.byClass(B.class)
            .build());

String changelog = javers.processChangeList(changes, new SimpleTextChangeLog());
System.out.println(changelog);

输出显示零变化。我期待看到一个被移除的对象,因为 B 是一个实体并且有一个 Id。我错过了什么?

编辑 感谢您迄今为止在评论中的回答。可能我说的不够详细。对于那个很抱歉。

我要查询的是 A 上的所有更改和 B 上的所有更改。我只提交 A,但也许这就是问题所在?我应该跟踪 A 和 B 吗?

4

1 回答 1

1

javers.compare()并且javers.commit()不要以相同的方式工作。 compare()只是比较两个对象图,没有任何上下文。这就是为什么您ObjectRemoved在比较图表时可以期待更改列表。

commit()用于审核更改。由于您已将这两个类映射为实体,因此它们是独立的。B 对象不能仅仅因为它们不再被 A 对象引用而被标记为已删除。

将它们标记为已删除(并更改 ObjectRemoved)的唯一方法是调用commitShallowDelete()

于 2017-02-06T20:24:37.017 回答