2017-06-27 33 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的影子查詢,可以執行實體連接,但有一些限制。我要寫一篇小文章來展示它的工作原理 –