1

我有一个简单的测试设置来在 Spring Boot 应用程序中创建一个实体(javers 已知),通过提交进行一些更改,然后报告更改。

我希望这能奏效,但我总是没有得到任何改变。

我可以让快照正常工作,但不能在 3.0.0 上进行更改。

有人有类似的经历吗?

示例代码:

@Test
public void simpleTest() {
    System.out.println(javers.getTypeMapping(Bookmark.class).prettyPrint());

    Bookmark bookmark = new Bookmark();
    bookmark.setName("new bookmark");
    bookmark = bookmarkService.saveBookmark(bookmark);
    javers.commit("creator", bookmark);

    bookmark.setName("updated bookmark");
    javers.commit("updater", bookmark);

    QueryBuilder jqlQuery = QueryBuilder.byInstance(bookmark);
    List<Change> changes = javers.findChanges(jqlQuery.build());
    String changeLog = javers.processChangeList(changes, new SimpleTextChangeLog());
    System.out.println(changeLog);
}

样本输出:

EntityType{
  baseType: class model.Bookmark
  typeName: model.Bookmark
  managedProperties:
    Field BigInteger id; //declared in Bookmark
    Field String name; //declared in Bookmark
  idProperty: id
}

main] o.javers.core.graph.ObjectGraphBuilder   : live graph assembled, object nodes: 1, entities: 1, valueObjects: 0
main] org.javers.core.Javers                   : Commit(id:1.2, snapshots:1, author:creator, changes - ValueChange:2 NewObject:1), done in 5 millis (factory:3, persist:2)
main] o.javers.core.graph.ObjectGraphBuilder   : live graph assembled, object nodes: 1, entities: 1, valueObjects: 0
main] o.j.c.j.t.commit.GlobalIdTypeAdapter     : deserializing {"entity":"model.Bookmark","cdoId":10002}
main] org.javers.core.Javers                   : Commit(id:2.2, snapshots:1, author:updater, changes - ValueChange:2 ObjectRemoved:1 NewObject:1), done in 10 millis (factory:7, persist:3)
main] o.j.c.j.t.commit.GlobalIdTypeAdapter     : deserializing {"entity":"model.Bookmark","cdoId":10002}
main] o.j.c.j.t.commit.GlobalIdTypeAdapter     : deserializing {"entity":"model.Bookmark","cdoId":10002}

更改大小为 0,输出为空白。我尝试了一些变化,但似乎没有任何效果。我什至尝试从 SQLServer 切换到 H2,但得到了相同的结果。

只是想知道我是否误解了文档,或者它是否可能是在 Java 8 上运行的 3.0.0 中的错误。

谢谢!

4

4 回答 4

0

挖掘 Javers 代码,似乎他们生成了快照的 shadowGraph,这只是一个集合。

在检查此对象是更新项目还是新项目时,它会通过查看新项目是否在集合中来查看它是否在阴影图中。

使用集合中项目的 globalId 对它们进行比较。

但是,我的对象在类型名之后总是有一些奇怪的信息,这导致它们永远不会等同,因此总是假定一个新对象。

截屏: 在此处输入图像描述

于 2017-03-02T00:05:25.060 回答
0

BigInteger 不映射为 Value 而是 ValueObject。你的 PR 应该能解决这个问题。感谢您的贡献,我们将尽快发布。

于 2017-03-02T22:38:54.390 回答
0

此问题已通过修改 Javers 以使用 BigInteger 作为众所周知的类型来修复,以便将 cdoId 正确转换为字符串值。

我已经生成了一个拉取请求来完成这个:

https://github.com/javers/javers/pull/508

于 2017-03-02T02:01:45.417 回答
0

更改我的查询让我可以取回结果:

QueryBuilder jqlQuery = QueryBuilder.byInstance(bookmark);

QueryBuilder jqlQuery = QueryBuilder.byInstance(bookmark).withNewObjectChanges();

这是因为即使在重新启动后,我的所有对象都被标记为“INITIAL”类型。需要对为什么会发生这种情况进行更多调查,但目前,这是一种解决方法。

于 2017-03-01T22:51:31.230 回答