使用javers 3.0.0并且无法对H2或SQLServer进行更改

时间:2017-03-01 22:14:44

标签: javers

我有一个简单的测试设置,可以在Spring启动应用程序中创建一个实体(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 个答案:

答案 0 :(得分:0)

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

QueryBuilder jqlQuery = QueryBuilder.byInstance(bookmark);

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

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

答案 1 :(得分:0)

通过Javers代码挖掘,它们似乎生成了快照的阴影图,这只是一个集合。

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

使用集合中项目的globalId,进行比较。

但是,我的对象在typename之后总是有一些奇怪的信息,这使得它们永远不会等同,并且总是假设一个新的对象。

截图: enter image description here

答案 2 :(得分:0)

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

我已经生成了拉取请求来完成此操作:

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

答案 3 :(得分:0)

BigInteger未映射为Value而是ValueObject。你的公关应该解决这个问题。感谢您的贡献,我们很快就会发布。