我的应用程序中有一种需要进行版本控制(审核)的父对象,我的意思是:每次对其或其任何 n 深子对象进行更改时,都会有一个新的修订必须创建。

@Entity class Document { 
    @Id String name; 
    // some props ... 
    @OneToMany List<Page> pages; 
    // getters and setters ... 
} 
 
@Entity class Page { 
    @Id Long number; 
    @ManyToOne Document document; 
    // some props ... 
    String header; 
    // getters and setters ... 
} 

在上面的示例中,如果我要更改页面的标题,则应为整个 Document 实体保留新的修订版本:

// retrieve document 
Document document = documentRepository.findById(myBookId); 
// change something on first found page 
document.getPages().iterator().next().setHeader("Hello World"); 
// persist the document 
documentRepository.save(document); 
// new revision of the document! 

我正在考虑使用JaversEnvers但似乎他们都做不到。

你们中有人知道如何在这些库上做类似的事情吗?或者知道我可以用于此目的的任何库吗?

请您参考如下方法:

如果将 Page 类映射为 ValueObject,然后使用 Shadow 查询,则可以在 Javers 中实现它。另外,您应该始终提交Document:

    @Entity 
    class Document { 
        @Id String name 
        @OneToMany List<Page> pages 
 
        @Override 
        String toString() { 
            "Document $name, pages:$pages" 
        } 
    } 
 
    @org.javers.core.metamodel.annotation.ValueObject 
    @Entity 
    @ToString 
    class Page { 
        @Id Long number 
        @ManyToOne Document document 
        String header 
 
        @Override 
        String toString() { 
            "Page $number, $header" 
        } 
    } 
 
    def "should treat Document as aggregate"(){ 
      given: 
      def javers = JaversBuilder.javers().build() 
 
      def doc = new Document(name:"1", pages: [new Page(header:"a"), new Page(header:"b")]) 
      javers.commit("author", doc) 
 
      when: 
      doc = new Document(name:"1", pages: [new Page(header:"a"), new Page(header:"ccc")]) 
      javers.commit("author", doc) 
 
      def shadows = javers.findShadows(QueryBuilder.byClass(Document).build()) 
 
      then: 
      shadows 
 
      shadows.forEach{s -> println(s.commitMetadata.commitDate.toString() + " " + s.get())} 
    } 

输出:

23:25:47.297 [main] INFO  org.javers.core.Javers - Commit(id:1.0, snapshots:3, author:author, changes - NewObject:3), done in 56 millis (diff:45, persist:11) 
23:25:47.315 [main] INFO  org.javers.core.Javers - Commit(id:2.0, snapshots:1, author:author, changes - ValueChange:1), done in 17 millis (diff:17, persist:0) 
23:25:47.337 [main] DEBUG org.javers.JQL - SHALLOW query: 4 snapshots loaded (entities: 1, valueObjects: 3) 
23:25:47.358 [main] DEBUG org.javers.JQL - queryForShadows executed:  
2019-04-08T23:25:47.298618 Document 1, pages:[Page null, a, Page null, ccc] 
2019-04-08T23:25:47.275570 Document 1, pages:[Page null, a, Page null, b] 


评论关闭
IT干货网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!