观察列表中删除的对象
Observe removed objects in lists
我们目前使用的是 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;
}
}
这是我们相当简单的 class 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 吗?
javers.compare()
和 javers.commit()
的工作方式不同。
compare()
只是比较两个对象图,没有任何上下文。
这就是为什么在比较图表时您可能会期望 ObjectRemoved
在更改列表中。
但 commit()
用于审核更改。
由于您已将 类 都映射为实体,因此它们是独立的。 B 对象不能仅仅因为它们不再被 A 对象引用而被标记为已删除。
将它们标记为已删除(并更改 ObjectRemoved)的唯一方法是调用 commitShallowDelete()
我们目前使用的是 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;
}
}
这是我们相当简单的 class 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 吗?
javers.compare()
和 javers.commit()
的工作方式不同。
compare()
只是比较两个对象图,没有任何上下文。
这就是为什么在比较图表时您可能会期望 ObjectRemoved
在更改列表中。
但 commit()
用于审核更改。
由于您已将 类 都映射为实体,因此它们是独立的。 B 对象不能仅仅因为它们不再被 A 对象引用而被标记为已删除。
将它们标记为已删除(并更改 ObjectRemoved)的唯一方法是调用 commitShallowDelete()