2017-06-27 61 views
0

我是新来的Stackoverflow,所以我会尽我所能去符合用法。我想知道是否有办法获得给定实体的更改/快照的完整列表。目前,它适用于Singular Properties版本,以及对收集财产的添加和删除。但是我无法找到Collection Property中的子实体何时更新。JaVers,SpringDatat,JPA:查询集合中的实体更新

给定两个实体,和LinkEntity:

@Entity 
class Person { 
    @Id 
    Long id; 

    @OneToMany(mappedBy = "person", cascade = CascadeType.ALL) 
    Set<LinkAddress> addresses; 
} 

@Entity 
class Address { 
    @Id 
    Long id; 

    @OneToMany(mappedBy = "address") 
    Set<Address> persons; 
} 

@Entity 
class LinkPersonAddress { 
    @Id 
    Long id; 

    @ManyToOne 
    @ShallowReference 
    Person person; 

    @ManyToOne 
    @ShallowReference 
    Address address; 

    String linkType; 
} 

我的使用情况如下。我通过ID#1获得了一个特定的人,然后改变了特定地址的类型(即。HOME - > WORK)。我用修改后的Set保存Person,让JPA级联我的更改。虽然所有的Spring人员,地址和LinkPersonAddress Spring数据存储库都使用@JaversSpringDataAuditable进行了注释,但我无法使用Javers QueryBuilder和Person和Id#1来检索此“更新”。这是有道理的,因为我应该查询类LinkPersonAddress,但是我怎样才能指定我只需要LinkPersonAddress与ID为1的Person相关的更改。

PS:请道歉代码片段中的任何拼写错误,因为我没有写在我的开发环境中。

回答

0

让我们从映射开始。你做错了,Address是一个经典的ValueObject(见https://javers.org/documentation/domain-configuration/#value-object)而非Entity。因为:

  • 地址没有自己的身份(用分贝序列genereted不算主键)
  • 地址被人实体拥有。具有地址的人形成了总结。

当你正确的映射,您可以使用ChildValueObjects过滤器,见https://javers.org/documentation/jql-examples/#child-value-objects-filter

+0

我听你的,但可能我的例子(这是不是我的实际使用情况)还不够好。假设我们有学生,课程和LinkTable类型(Auditor,Enrolled)。我想完整记录给定课程(全部更新课程属性),并以某种方式汇总给定学生包容性注册的完整历史记录。那么你是说LinkTable本身应该是ValueObject,即使从JPA的角度来看它也必须用@Entity来注释?首次配置Javers时,使用自定义ValueObject映射来使用JPA Annotation? –

+0

我按照您的建议进一步尝试了一下,使链接成为一个有价值的对象,但后来我尝试更新一个学生,其中包含两门课程,即作为审核员的课程1和已注册的课程2。我想将第二个链接切换到Auditor,并且我得到了Change,ValueRemoved(oldLink)和ValueAdded(newLink),每个引用不同的globalId,尽管我只更新了链接(JPA Id保持稳定)。我认为我的链接有其自己的身份,虽然由其父“拥有”。我们处于混合状态吗? –

+0

在Javers查询(JQL)中,实体之间没有完整的连接。你可以做什么,是使用ChildValueObjects过滤器将ValueObjects连接到其拥有的实体。 另一种选择是Shadow查询,请参阅https://javers.org/documentation/jql-examples/#query-for-shadows 带范围COMMIT的影子查询,可以执行实体连接,但有一些限制。我要写一篇小文章来展示它的工作原理 –