我有一个简单的测试设置,可以在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中的错误。
谢谢!
答案 0 :(得分:0)
更改我的查询后,我可以取回结果:
QueryBuilder jqlQuery = QueryBuilder.byInstance(bookmark);
到
QueryBuilder jqlQuery = QueryBuilder.byInstance(bookmark).withNewObjectChanges();
这是因为即使在重新启动后,我的所有对象都被标记为“INITIAL”类型。需要进行更多的调查,了解为什么会发生这种情况,但目前来说,这是一种解决方法。
答案 1 :(得分:0)
通过Javers代码挖掘,它们似乎生成了快照的阴影图,这只是一个集合。
当检查此对象是更新还是新项目时,它会通过查看新项目是否在集合中来查看它是否在影子图形中。
使用集合中项目的globalId,进行比较。
但是,我的对象在typename之后总是有一些奇怪的信息,这使得它们永远不会等同,并且总是假设一个新的对象。
答案 2 :(得分:0)
通过修改Javers以使用BigInteger作为众所周知的类型来修复此问题,以便将cdoId正确转换为字符串值。
我已经生成了拉取请求来完成此操作:
答案 3 :(得分:0)
BigInteger未映射为Value而是ValueObject。你的公关应该解决这个问题。感谢您的贡献,我们很快就会发布。